我正在使用Android的Room库来进行应用程序中的数据库交互,我有点困惑于如何防止重复条目被插入到数据库中。
我觉得我一定是漏掉了什么,因为这看起来应该很简单。我在谷歌上搜索了与这个主题相关的各种单词组合,但都没有结果。
实际上,我使用的是其中一个示例执行的插入和查询操作。
实体:
@Entity(tableName = "cameras")
public class CameraEntity {
@PrimaryKey(autoGenerate = true)
private int id;
private Integer accountId;
private Integer dvrId;
private String vendorId;
...
}
刀:
@Dao
public interface CameraDao {
@Query("SELECT * FROM cameras")
Flowable<List<CameraEntity>> getCameras();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<CameraEntity> values);
}
就Room库而言,有没有办法设置何时插入数据的规则?我读过的一个帖子提到,自动递增ID导致每个项目在主键方面是唯一的。如果这是真的,其他人是如何使用这个库的呢?
谢谢!
发布于 2017-10-24 18:04:48
只有在您确实需要自动生成的主键时,才使用它作为主键。如果您的数据有一个自然的主键,那么就使用它,它决定了REPLACE
所做的事情的唯一性。
如果您想要一个自动生成的主键,但又希望其他一些列(或列的组合)是唯一的,那么在这些列上添加a unique index,这也会影响REPLACE
。
发布于 2019-05-22 09:23:13
我在使用房间数据库的第一个应用程序中遇到了这种情况。我需要一些东西,如果列数据存在,更新行中的其他数据,否则插入到表
我有一个主键和一个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);
希望它能帮上忙
https://stackoverflow.com/questions/46916388
复制