Android Room:@Ignore vs Transient
Posted
技术标签:
【中文标题】Android Room:@Ignore vs Transient【英文标题】:Android Room: @Ignore vs Transient 【发布时间】:2018-05-22 22:14:18 【问题描述】:这两者在 Room 数据库实体的上下文中是否可以互换,或者如果不能,它们之间有什么区别?
【问题讨论】:
我在 Room 中找不到对瞬态的引用。 developer.android.com/training/data-storage/room/… transient 是集成关键字,@ignore 是 Room 添加的 @joao86 docs.oracle.com/javase/specs/jls/se7/html/… kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-transient/… 【参考方案1】:@Ignore
是特定于 Room 的注解,表示 Room 应该忽略该字段或方法。
transient
是一个Java构造,表示this field should not be serialized in standard Java serialization。 Room happens to treat this similarly to @Ignore
by default。大多数情况下,您从某个恰好使用 transient
的类继承而您不控制该类(例如,它来自库)。
对于您自己的代码,如果您不使用 Java 序列化,我建议您使用 @Ignore
字段。 transient
不是方法的可用关键字,所以要告诉 Room 忽略某些构造函数,你别无选择,只能使用 @Ignore
。
【讨论】:
【参考方案2】:添加到 CommonsWare 的答案
transient
不是像 CommonsWare 回答的那样忽略 Room 字段的好选择。当使用相同的模态从服务器解析数据并存储到数据库时,它将创建阻塞器。
假设您有一个模态类MyModal.java
,如下所示
public static class MyModal
@SerializedName(“intField”)
public int intField;
@SerializedName(“strField”)
public String strField;
@SerializedName(“booleanField”)
public boolean booleanField;
如果您不想将 booleanField 保存到数据库中,并且您将该字段修改为
transient
:它会在保存到数据库时忽略这个字段,但是在解析来自服务器的数据时它也会忽略这个字段。
@Ignore
: 向数据库插入数据时只会忽略该字段,但该字段会参与json解析。
【讨论】:
我该如何:在 json 解析时忽略该字段,但将其包含在数据库中? 找到我自己评论的答案:@ColumnInfo(name = "show_id")
public transient String showId;
大多数时候我们需要反之。以上是关于Android Room:@Ignore vs Transient的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中将 MySql 查询转换为 SQL Room 查询 - kotlin
是否可以在 Android Room 中使用 String 作为 PrimaryKey