安卓 Room 插入重复实体

15

我在一个应用程序中使用Android的Room库进行数据库交互,但我被如何防止重复项插入到数据库中这个问题卡住了。

我觉得我一定漏掉了什么,因为这似乎应该很容易做到。我已经尝试了与此相关的各种搜索关键字,但没有结果。

本质上,我正在使用一个示例用于插入和查询的操作。

该实体:

@Entity(tableName = "cameras")
public class CameraEntity {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private Integer accountId;
    private Integer dvrId;
    private String vendorId;
    ...
}

DAO:

@Dao
public interface CameraDao {

    @Query("SELECT * FROM cameras")
    Flowable<List<CameraEntity>> getCameras();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<CameraEntity> values);
}

在Room库方面,有没有一些方法可以设置规则来确定何时插入数据?我读过一篇帖子提到自动递增ID导致每个项目在主键方面都是唯一的。如果这是真的,那么其他使用该库的人是如何处理的呢?

谢谢!


{btsdaf} - CommonsWare
{btsdaf} - andsec
1
{btsdaf} - CommonsWare
{btsdaf} - andsec
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
23

只有在真正需要主键时才使用自动生成的主键。如果您的数据具有自然主键,请使用它,并确定其唯一性,就像 REPLACE 所做的那样。

如果您想要一个自动生成的主键,但同时又希望某些其他列(或列组合)是唯一的,请在该列上添加 唯一索引,这也会影响到 REPLACE


2
OnUpdate = CASCADE 将替换重复的条目,此链接说明了如何将唯一性应用于多个列 https://developer.android.com/training/data-storage/room/defining-data.html#indices-uniqueness - xrnd
@CommonsWare 我该如何允许重复的条目,我的 room-database 自动替换任何重复的条目... 请参见 [这个链接]:https://stackoverflow.com/questions/49728357/room-is-not-allowing-me-to-add-duplicate-entries-how-to-add-duplicate-entries - Santanu Sur
唯一索引 URL 已过时--尝试编辑,但被告知有太多待处理的编辑,因此在此处:https://developer.android.com/training/data-storage/room/defining-data#column-indexing。 - Bink

20

在第一次使用room数据库时,我遇到了这种情况。我需要一个东西来检查列数据是否存在,如果存在,则更新行中的其他数据,否则插入到表中。

我有一个主键和一个uid(这里是accountId或dvrId),它们也像主键一样,不应重复

要做到这一点,您必须为Entity创建indices,并将所有您不想替换的列放入其中,就像这样:

@Entity(tableName = "cameras", indices = [Index(value = ["accountId","dvrId"], unique = true)])
public class CameraEntity {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private Integer accountId;
    private Integer dvrId;
    private String vendorId;
}

不要忘记选择替换策略

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<CameraEntity> values);

如果同一列数据中存在id、accountId和dvrId中的任何一个,则数据将被更新;否则,在新行中插入数据。

希望它能够帮到你。


1
我需要仅更新表格中的几个字段,使用您的答案是否可行? - hio
1
谢谢。我认为这应该被接受。 - Varun A M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,