2017-08-11 42 views
0

该实体只包含一个项目ID,这也是primaryKey,我在DB中存储例如3个项目,当列表更新时,新的3个项目我需要用新的替换现有的列表。但对我来说它增加了新的,但我需要完全取代现有的如何用房间持久性中的新列表替换项目列表?

@Dao 
public interface UserIdDao { 
@Query("SELECT * FROM userIds") 
Flowable<List<UserId>> allUserIds(); 

@Insert(onConflict = OnConflictStrategy.REPLACE) 
List<Long> update(List<UserId> ids); 
} 

@Entity 
public class UserId{ 
    @PrimaryKey 
    private Long id; 

@Override 
public boolean equals(Object o) { 
if (this == o) return true; 
if (o == null || getClass() != o.getClass()) return false; 

UserId userId = (UserFavoriteStore) o; 

return (!id.equals(userId.id)); 
} 
@Override 


public int hashCode() { 
int result = id.hashCode(); 
result = 31 * result + (id.hashCode()); 
return result; 
}} 
+0

“时更新列表“ - 什么名单? – CommonsWare

+0

列表更新(列表 ID); 我的意思是用户名列表 –

回答

1

我需要更换新的一个现有列表。但在我的情况下,它增加了新的,但我需要完全取代现有的

你写代码检索ID和插入ID。你没有代码来删除ID。

因此,将一个@Delete方法添加到您的DAO以删除不再需要的ID。然后,当您想要替换ID时,请使用@Delete方法和@Insert删除那些您不再需要的ID。

OnConflictStrategy.REPLACE说:“如果你尝试插入,通过他们的主键匹配现有行一排,不死机,而是 现有行 在更换其他列插入新的之前删除违规行” (见the SQLite docs)。你的情况:

  • 你没有其他列
  • 插入新的ID将无法通过自己的主键匹配现有的ID,因为您的数据完全是一个主键
+0

好吧,如果我添加列名(字符串)可能是唯一的,但它不是primaryKey,因为它是字符串,可以不删除,只使用插入方法? –

+0

@ A.A.I.A:首先,主键可以是一个字符串。其次,我不认为Room现在支持'UNIQUE'约束,只有唯一的索引,我不知道SQLite的REPLACE策略如何处理这种情况。 – CommonsWare

+0

多一个问题如果我有第一个2片段我呼吁allUserIds()和第二我只调用更新/删除,如果我回到第一个片段它应该更新,因为返回类型是可流动的,我有rx。订阅,是吗? –