2017-08-11 3 views
0

エンティティは1つのアイテムIDだけで構成されます。これもプライマリキーです。たとえば、リストが更新されたときに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

完全に主キーであるため、リストが更新されたときに、新しいIDが「、彼らの主キーによって、既存のIDと一致しません挿入する他の列

  • を持っていません" - どのようなリスト? – CommonsWare

  • +0

    リスト更新(リスト ids); 私はユーザIDのリスト –

    答えて

    1

    を交換する必要があります。しかし私の場合は新しいものを追加しますが、既存のものを完全に置き換える必要があります

    あなたはIDを取得してIDを挿入するコードを書いています。 IDを削除するコードはありません。

    したがって、不要になったIDを削除するには、@DeleteメソッドをDAOに追加します。次に、IDを置き換えたいときは、不要なものを@Deleteメソッドで削除し、@Insertのものを削除してください。

    OnConflictStrategy.REPLACE

    は「あなたが彼らの主キーによって既存の行と一致する行を挿入しようとした場合、新しいものを挿入する前に、問題のある行を削除クラッシュし、代わりに その既存の行 で他の列を置き換えるものではありません」と言います( the SQLite docs参照)。あなたのケースでは:

    • あなたはあなたのデータは
    +0

    のリストを確認します。一意にすることができる列名(String)を追加しても、それはStringのようにprimaryKeyではないので、insertメソッドでのみ削除することができますか? –

    +0

    @ A.A.I.A:まず、主キーは文字列にすることができます。第二に、私はRoomがこの時点でUNIQUE制約をサポートしているとは思えません。独自のインデックスだけで、SQLiteの 'REPLACE'戦略がどのようにそのシナリオを処理するのか分かりません。 – CommonsWare

    +0

    もう1つの質問最初の2つのフラグメントがある場合は、allUserIds()を呼び出し、2番目のメソッドでは更新/削除のみを呼び出す。最初のフラグメントに戻ると、戻り値の型がflowableでrxがあるので更新する必要がある。サブスクリプション、はい? –

    関連する問題