【问题标题】:Android Room inserts duplicate entitiesAndroid Room 插入重复的实体
【发布时间】:2017-10-24 17:16:48
【问题描述】:

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

谢谢!

【问题讨论】:

  • “自动增量 ID 导致每个项目在主键方面都是唯一的”——正确。 “如何防止重复条目被插入到数据库中”——你如何定义“重复条目”?我们无法知道,部分原因是您的 CameraEntity 列表已被编辑。
  • 好点。为了讨论,我添加了更多字段。我会将重复条目定义为具有匹配 vendorId 的任何内容(在本例中为字符串)。
  • 然后将其设为主键。或者,添加a unique index。
  • @CommonsWare 太棒了,唯一索引似乎可以解决问题!谢谢!我想这将是我错过的一些简单的事情。

标签: android sqlite rx-java2 android-room


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

我有一个主键和一个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 存在于同一列中,数据将更新,否则数据将插入新行

希望对你有帮助

【讨论】:

  • 我只需要更新我桌子上的几个文件,这可以用你的答案吗?
  • 谢谢。我认为这应该被接受。
猜你喜欢
  • 2017-11-23
  • 2020-05-27
  • 2010-12-30
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多