Android 房间 table 具有唯一的替换约束
Android Room table with unique on replace constraint
我正在迁移我的应用以使用 Room,需要一些帮助来弄清楚如何正确注释我的 table 之一。
现有的 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 )
我的新实体class如下:
@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 ... }
我相信这是 table 的正确表示,但是 ON CONFLICT REPLACE 约束让我失望。由于 Room 使用 SupportSqlOpenHelper/Database,新的包装器 API 在查询时将冲突策略包含在其中。这会取代对 table 的限制吗?我的 DAO 现在需要处理每个查询的冲突吗?或者是否有一个字段可以注释我丢失的实体中的替换?
用 OnConflictStrategy 注释你所有的 DAO 方法,实体不提供这样的机会。
我正在迁移我的应用以使用 Room,需要一些帮助来弄清楚如何正确注释我的 table 之一。
现有的 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 )
我的新实体class如下:
@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 ... }
我相信这是 table 的正确表示,但是 ON CONFLICT REPLACE 约束让我失望。由于 Room 使用 SupportSqlOpenHelper/Database,新的包装器 API 在查询时将冲突策略包含在其中。这会取代对 table 的限制吗?我的 DAO 现在需要处理每个查询的冲突吗?或者是否有一个字段可以注释我丢失的实体中的替换?
用 OnConflictStrategy 注释你所有的 DAO 方法,实体不提供这样的机会。