Android Room表具有唯一的替换约束

时间:2018-05-30 17:48:38

标签: android android-room android-architecture-components

我正在将我的应用迁移到使用Room,需要一些帮助来确定如何正确地注释我的一个表。

现有的SQL脚本如下所示:

CREATE TABLE member_rooms (
   _id INTEGER PRIMARY KEY AUTOINCREMENT,
   new_messages INTEGER DEFAULT 0,
   member_id_fk TEXT,
   FOREIGN KEY ( member_id_fk ) REFERENCES members ( member_id ) ON DELETE CASCADE,
   UNIQUE ( member_id ) ON CONFLICT REPLACE )

我的新实体类如下:

@Entity(tableName = "member_rooms",
        indices = {@Index(value = {"member_id_fk"}, unique = true)},
        foreignKeys = {@ForeignKey(entity = MemberTableModel.class,
              parentColumns = "member_id",
              childColumns = "member_id_fk",
              onDelete = CASCADE)})
public class MemberRoomTableModel {
    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "_id")
    private int rowId;

    @ColumnInfo(name = "new_messages")
    private int numNewMessages;

    @ColumnInfo(name = "member_id_fk")
    private String memberId;

   .... constructors getters etc ... }

我相信这是该表的正确表示,但是ON CONFLICT REPLACE约束是让我失望的。由于Room使用SupportSqlOpenHelper / Database,因此新的包装器API在查询时包含冲突策略。这会替换表上的约束吗?我的DAO现在需要处理每个查询的冲突吗?或者是否有一个字段来注释在实体中替换我缺少的东西?

1 个答案:

答案 0 :(得分:1)

使用OnConflictStrategy注释所有DAO方法,实体不提供这样的机会。