在我的SQLite数据库中,我定义了这个表:
CREATE TABLE `lh_psalm_join` (
`groupFK` INTEGER NOT NULL,
`readingFK` INTEGER NOT NULL,
`theOrder` INTEGER NOT NULL,
`themeFK` INTEGER DEFAULT NULL,
`epigraphFK` INTEGER DEFAULT NULL,
`thePart` INTEGER DEFAULT NULL,
PRIMARY KEY (`groupFK`, `readingFK`),
FOREIGN KEY(`groupFK`) REFERENCES `lh_psalmody_join`(`groupID`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(`readingFK`) REFERENCES `lh_psalm`(`psalmID`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(`epigraphFK`) REFERENCES `lh_epigraph`(`epigraphID`) ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY(`themeFK`) REFERENCES `lh_theme`(`themeID`) ON DELETE SET NULL ON UPDATE CASCADE
);
我的问题是关于theOrder
列,在实体中我这样定义它:
@ColumnInfo(name = "thePart", defaultValue = "NULL")
var thePart: Int?
检索数据,当数据库中theParte
的值为null
时,它就变成了0
。
我意识到这一点,因为当我试图做这个检查时,它告诉我它总是正确的:
if (thePart != null || thePart !=0)
在房间中,null
值是否转换为0
?if (myVaule != 0)
对这种情况是否足够?
我看了documentation,找不到任何关于它的东西。
3条答案
按热度按时间2cmtqfgy1#
房间未将null转换为0。你对自己条件句的分析
不正确.
考虑
thePart
值的三种可能类别:|
thePart
的值|结果|| --|--|
| null|
thePart != 0
为true|| 0 |
thePart != null
为true|| 除0以外的任何整数|
thePart != null
为true|所以无论如何,两个条件中的一个都为真,并且两个条件都使用
||
,所以它必须始终为真。izkcnapc2#
简而言之,Room不会将null转换为0,根据警告问题,您的逻辑将始终导致true。
说明
我意识到这一点,因为当我试图做这个检查时,它告诉我它总是正确的:
if (thePart != null || thePart !=0)
假设thePart为null
如果是零的话,那就是零,如果是零的话,那就是零,如果是零,那就是零。
如果thePart是10(或者除了0以外的任何值),那么因为10不是null,所以你得到一个true。
在零件为0的情况下,0也不是null,所以为真。
因此,你总是会得到真实的,与房间无关。
介绍房间的功能
忽略Foreign Keys(因为它们需要引用的表存在),那么您的@Entity类将沿着行:-
也是一个@Dao注解接口,允许插入和提取数据
这将生成create SQL:
也就是说,将外键与问题中提供的SQL相同。
现在考虑下面的活动代码(注意,为了简洁和方便,
.allowMainThreadQueries
方法已经包含在Room databaseBuilder中):第一次运行(上述仅打算运行一次)的日志结果包括:-
1.显然,Room没有将null替换为0,反之亦然。
THM=null EP=null PRT=null
1.逻辑结果清楚地表明,即使部分为假,对两个测试进行OR运算,也会返回假。
为了进一步证明空值存储在数据库中,应用程序检查(在运行上述程序后)显示:
nnvyjq4y3#
默认值:在Room实体类中定义属性时,如果未指定默认值,则该属性将被设置为其数据类型的默认值。例如,如果您有一个整数字段,并且它没有显式设置为值,则它将默认为0。
对于空值