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

Posted

技术标签:

【中文标题】具有唯一替换约束的 Android Room 表【英文标题】:Android Room table with unique on replace constraint 【发布时间】:2018-11-09 15:58:25 【问题描述】:

我正在迁移我的应用以使用 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】:

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

【讨论】:

好吧。所以我认为在迁移到房间期间尝试保留现有数据时,差异不会导致问题?它只会归结为表名、列和索引/键匹配? 我没有将现有数据迁移到房间,所以我不知道:(

以上是关于具有唯一替换约束的 Android Room 表的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql多个表具有相同的外键唯一约束

查找列是不是具有唯一约束

FOREIGN KEY 约束失败(代码 787)[NO ANDROID ROOM]

Android Room FOREIGN KEY 约束失败(代码 787)

具有唯一索引和主键的列给出唯一约束违规

具有定义值的唯一约束