Android Room会插入重复的实体

and*_*sec 6 sqlite android rx-java2 android-room

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

我觉得我必须遗漏一些东西,因为这似乎应该很简单.我搜索谷歌搜索与该主题相关的各种单词组合无济于事.

我基本上使用其中一个示例进行插入和查询.

实体:

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

DAO:

@Dao
public interface CameraDao {

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

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<CameraEntity> values);
}
Run Code Online (Sandbox Code Playgroud)

就Room库而言,有没有办法在何时插入数据时设置一些规则?我读过的一篇文章提到自动增量ID导致每个项目在主键方面是唯一的.如果这是真的,其他人如何使用这个库来解释这个问题呢?

谢谢!

Com*_*are 13

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

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

  • OnUpdate = CASCADE 将替换重复的条目,此链接解释了我们如何将唯一性应用于多个列 https://developer.android.com/training/data-storage/room/defining-data.html#indices-uniqueness (2认同)

Rad*_*esh 13

我在第一个使用房间数据库的应用程序中遇到了这种情况。如果该列数据存在,我需要一些东西来更新行中的其他数据,否则插入到表中

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

对于这样做,你必须创建indicesEntity,并把所有的列,你不希望替换它像这样

@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;
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记选择 REPLACE 策略

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<CameraEntity> values);
Run Code Online (Sandbox Code Playgroud)

现在,如果同一列中存在任何id 和 accountId 和 dvrId 数据将更新,否则数据将插入新行

希望有帮助