我在使用Android Room
的NOT NULL
列时遇到一些问题。我已经在使用@android.support.annotation.NonNull
注解,但它不能像预期的那样工作。问题如下:
我有一个随着时间推移而建立起来的数据结构。这意味着构造函数不会构建最终示例。但是一些在数据库中必须具有NOT NULL
约束的字段不会在构造函数中初始化。因此,在一段时间内,它们将具有null
值。但Android Studio
似乎并不喜欢它。到处都是警告Not-null fields must be initialized
。
有没有其他注解可以用来代替上面提到的注解,以便NOT NULL
约束应用于数据库列,而不是应用于在Java代码中定义的字段?
我认为下面的例子更好地描述了这个问题:
我有一个表transaction
和一个列amount
,其中有一个NOT NULL
约束。在我的代码中构造新的transaction
时,我还没有可用的数量。我想稍后再分配它。但这并不意味着此字段在数据库中应该是NULL
‘。
那么,在这种情况下,最好的解决方案是什么?
1条答案
按热度按时间xxls0lw81#
如果您使用
@NonNull
注解,那么正如您已经发现的,该值在任何级别都不能为空。也就是说,该注解不是Room注解,而是Android注解。对于Room,它通过检查用@Entity注解的类来确定列类型和约束,如果它们在通过@数据库注解的Entities参数定义的实体列表中。
对于NOT NULL约束,则适用一些规则。
Long
而不是long
),则除非使用构造函数,否则不存在隐式NOT NULL。举例来说,请考虑:
当使用扩展RoomDatabase的适当@Database注解类编译时,会生成以下SQL:-
例如,如果
则SQL更改为包括非空约束,例如
这些都是强加的规则。
那么,作为对的响应,我是否可以使用其他注解来代替上面提到的注解,以便将NOT NULL约束应用于数据库列,而不是应用于我的Java代码中定义的字段?
不是。
但是,您可以记住NOT NULL约束应用于数据库中的列,拥有允许NULL的构造函数。或许可以考虑以下可能适合的做法:
@Ignore
注解告诉Room不要使用此构造函数,因此它在创建事务对象时将始终使用默认构造函数。