Android Room 插入重复实体

标签 android sqlite rx-java2 android-room

我在应用程序中使用 Android 的 Room 库进行数据库交互,但我对如何防止将重复条目插入数据库感到困惑。

我觉得我一定遗漏了什么,因为这看起来应该很容易做到。我在 Google 上搜索了与该主题相关的各种单词组合,但均无果。

我实际上是在使用其中一个样本的插入和查询功能。

实体:

@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 library而言,有什么方法可以设置一些关于何时应该插入数据的规则吗?我读过的一篇文章提到,自动递增 ID 导致每个项目在主键方面都是唯一的。如果这是真的,其他人如何使用这个库来解释这一点?

谢谢!

最佳答案

仅当您确实需要作为主键时才使用自动生成的主键。如果您的数据具有自然主键,请使用它,它根据 REPLACE 将执行的操作确定唯一性。

如果您想要一个自动生成的主键,但您还希望其他一些列(或列的组合)是唯一的,请添加 a unique index在列上,这也会影响 REPLACE

关于Android Room 插入重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46916388/

相关文章:

database - 如何打开核心数据数据库?

ios - 如何在后台运行代码?使用 dispatch_async 它是如何工作的?

android - 在后台多次调用 AddValueEventListener

android - 如何确定 ExpandableListView groupIndicator 图标的适当尺寸?

iphone - 将以前创建的 Sqlite 数据库写入 iOS 文档的最佳方法是什么

java - 谁能告诉我为什么 RxJava2 (v2.2.4) 中的共享运算符没有按照我的单元测试中的断言运行?

android - 为什么即使指定不同的订阅线程,Room 删除操作(使用 RxJava)也会出现 UI 线程错误?

kotlin - 测试 RxJava2 Flowable Query Room

android - SurfaceHolder.setType 已弃用...但需要吗?

android - 将项目动态添加到 recyclerview