Android 房间"插入" - 如何通过比较对象字符串来验证我不会输入相同的对象?



我有以下房间实体 -

@Entity(tableName = "recent_search_table")
public class RecentSearchModel {

@PrimaryKey(autoGenerate = true)
private int ID;
private String query;
public RecentSearchModel(){
}
public RecentSearchModel(String query) {
this.query = query;
}
public void setID(int ID) {
this.ID = ID;
}
public int getID() {
return ID;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
@Override
public String toString() {
return "RecentSearchModel{" +
"query='" + query + ''' +
'}';
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof RecentSearchModel)
return this.query.equalsIgnoreCase(((RecentSearchModel) obj).query);
return false;
}
}

和以下 DAO -

@Dao
public interface RecentSearchDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(RecentSearchModel model);
@Update
void update(RecentSearchModel model);
@Delete
void delete(RecentSearchModel model);
@Query("select * from recent_search_table")
LiveData<List<RecentSearchModel>> getRecentSearchList();
}

现在发生的事情是,我在房间DB中一次又一次地写入相同的对象。我希望 DAO 通过使用我在实体类中构建的equals()方法来实际比较它们的query参数来防止添加相同的对象。如您所见,我添加了@Insert(onConflict = OnConflictStrategy.IGNORE)它确实...无。我仍然看到重复的值。

如何解决此问题?

@Entity(indices = arrayOf(Index(value = ["query"], unique = true)))
data class RecentSearchModel(
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "query") val query: String
)

将列标记为唯一列后,您可以使用@Insert(onConflict = OnConflictStrategy.IGNORE)

对于爪哇,

@Entity(indices = {@Index(value = {"query"}, unique = true)})

我们可以在Entity中使用indices注释,因为我们可以将哪一列定义为唯一列。

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

这是解释

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

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

@Entity(tableName = "recent_search_table")
public class RecentSearchModel {
@PrimaryKey
private String query;
public RecentSearchModel(){
}
public RecentSearchModel(String query) {
this.query = query;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
@Override
public String toString() {
return "RecentSearchModel{" +
"query='" + query + ''' +
'}';
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof RecentSearchModel)
return this.query.equalsIgnoreCase(((RecentSearchModel) obj).query);
return false;
}
}

相关内容

  • 没有找到相关文章

最新更新