Android Room`Insert`-如何通过比较对象字符串验证我不会输入相同的对象?

Android Room`Insert`-如何通过比较对象字符串验证我不会输入相同的对象?,android,entity,sql-insert,android-room,dao,Android,Entity,Sql Insert,Android Room,Dao,我有以下房间实体- @EntitytableName=最近的搜索表 公共类最近搜索模型{ @PrimaryKeyautoGenerate=true 私有int-ID; 私有字符串查询; 公共最近搜索模型{ } public RecentSearchModelString查询{ this.query=query; } 公共无效设置ID{ this.ID=ID; } 公共整数getID{ 返回ID; } 公共字符串getQuery{ 返回查询; } 公共void setQueryString查询{

我有以下房间实体-

@EntitytableName=最近的搜索表 公共类最近搜索模型{ @PrimaryKeyautoGenerate=true 私有int-ID; 私有字符串查询; 公共最近搜索模型{ } public RecentSearchModelString查询{ this.query=query; } 公共无效设置ID{ this.ID=ID; } 公共整数getID{ 返回ID; } 公共字符串getQuery{ 返回查询; } 公共void setQueryString查询{ this.query=query; } @凌驾 公共字符串toString{ 返回RecentSearchModel{+ query='+query+'\+ '}'; } @凌驾 公共布尔equals@Nullable对象对象对象{ 如果obj实例为RecentSearchModel 返回this.query.equalsIgnoreCaseRecentSearchModel obj.query; 返回false; } } 以及以下的道-

@刀 公共接口最新搜索DAO{ @InsertonConflict=OnConflictStrategy.IGNORE void insertRecentSearchModel; @更新 void-updateRecentSearchModel模型; @删除 void deleteRecentSearchModel模型; @查询从最近的搜索表中选择* LiveData getRecentSearchList; } 现在发生的事情是,我在我的房间DB中一次又一次地写入相同的对象。我希望DAO使用我在实体类中构建的equals方法,通过实际比较它们的查询参数来防止添加相同的对象。如您所见,我添加了@InsertonConflict=OnConflictStrategy.IGNORE,它不起任何作用。我仍然看到重复的值


我如何解决这个问题

我不确定room是否使用实体的equal方法来查找冲突,但我认为可以通过将查询作为表的主键并删除id来解决问题

一旦将列标记为唯一,就可以使用@InsertonConflict=OnConflictStrategy.IGNORE

对于Java

 @Entity(indices = {@Index(value = {"query"}, unique = true)})
我们可以在实体中使用索引注释,因为我们可以将哪个列定义为唯一列

@Entity(tableName = "test",indices = [Index(value = ["account"],unique = true)])
data class EmailUser(@PrimaryKey(autoGenerate = true) val uid: Int,
@ColumnInfo(name = "account") val account: String,

这是解释

> 唯一索引是通过确保表中没有两行数据具有相同的键值来帮助维护数据完整性的索引。为包含数据的现有表创建唯一索引时,将检查组成索引键的列或表达式中的值的唯一性


我也有同样的问题,注释OnConflict对meI也不起作用。我不认为有任何方法可以将equals方法用于房间插入。黑客攻击的方法是在后台线程中使用List.containsitemToInsert检索所有数据并检查数据库中是否包含实体。如果不存在,则调用insert。冲突策略也适用于唯一键?不仅仅是主键?如果是这样的话,@Alon Shlider这是你需要的答案我怎样才能取代arrayOf?我使用的是Java而不是Kotlin
 @Entity(indices = {@Index(value = {"query"}, unique = true)})
@Entity(tableName = "test",indices = [Index(value = ["account"],unique = true)])
data class EmailUser(@PrimaryKey(autoGenerate = true) val uid: Int,
@ColumnInfo(name = "account") val account: String,