sqlite Android Room插入重复实体

gc0ot86w  于 2023-04-12  发布在  SQLite
关注(0)|答案(2)|浏览(246)

我在一个应用程序中使用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导致每个项目在主键方面都是唯一的。如果这是真的,其他使用这个库的人是如何解释的?
谢谢!

dy2hfwbg

dy2hfwbg1#

如果你真的需要一个自动生成的主键,那么只使用自动生成的主键。如果你的数据有一个自然主键,那么就使用它,它决定了REPLACE的唯一性。
如果你想要一个自动生成的主键,但你也想让其他列(或列的组合)是唯一的,在列上添加一个唯一的索引,这也会影响REPLACE

9gm1akwq

9gm1akwq2#

我在第一个房间数据库应用程序中遇到了这种情况。我需要一些东西来如果该列数据存在更新行中的其他数据,否则插入到表中
我有一个主键和一个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;
}

别忘了选择REPLACE策略

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

现在,如果**id、accountId和dvrId中的任何一个存在于同一列中,则数据将更新,否则数据将插入新行
希望对你有帮助

相关问题