2017-08-11 91 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。訂閱,是嗎? –