Android Room会插入重复的实体

时间:2017-10-24 17:16:48

标签: android sqlite 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;
    ...
}

DAO:

@Dao
public interface CameraDao {

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:0)

我将这种情况留在有会议室数据库的第一个应用程序上。如果列数据存在更新行中的其他数据,我需要一些其他操作,否则插入到表

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

为此,您必须为indices创建Entity并像这样将所有不需要替换的列放在其中

@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中的任何一个,数据将更新,否则数据将插入新行中

希望有帮助