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的主要内容,如果未能解决你的问题,请参考以下文章

SQlite 数据库 VS Room 持久性库 [关闭]

在 Android 中将 MySql 查询转换为 SQL Room 查询 - kotlin

是否可以在 Android Room 中使用 String 作为 PrimaryKey

Room 不能选择一个构造函数,因为多个构造函数是合适的错误

GROUP BY vs INSERT IGNORE

Room----Android数据库(SQLite)