2017-10-24 73 views
1

私はアプリケーションでデータベースのやり取りにAndroidのRoomライブラリを使用しています。重複するエントリがデータベースに挿入されないようにする方法がわかりません。Androidルームに重複したエンティティが挿入されました

私は何かが行方不明になっているように感じるが、これは簡単なように思える。私は役に立たない件名に関連する言葉のさまざまな組み合わせをGoogleで検索しました。

私は基本的に、サンプルの1つを挿入したりクエリしたりするために使用しています。

エンティティ:

@Entity(tableName = "cameras") 
public class CameraEntity { 
    @PrimaryKey(autoGenerate = true) 
    private int id; 
    private Integer accountId; 
    private Integer dvrId; 
    private String vendorId; 
    ... 
} 

DAO:ルームライブラリーの面では

@Dao 
public interface CameraDao { 

    @Query("SELECT * FROM cameras") 
    Flowable<List<CameraEntity>> getCameras(); 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    void insertAll(List<CameraEntity> values); 
} 

、データが挿入されなければならないときに、いくつかのルールを設定する方法はありますか?私が読んだ1つの記事では、自動増分IDによって各項目がプライマリキーの点で一意であると述べています。そうだとすれば、このライブラリを使っている他の人たちはどうやってそれを説明していますか?

ありがとうございます!

+0

"自動インクリメントIDにより、各項目がプライマリキーの点で一意になりました" - 正しい。 "重複するエントリがデータベースに挿入されないようにする方法" - どのように "重複するエントリ"を定義していますか?あなたの 'CameraEntity'リストが編集されたため、私たちは知る方法がありません。 – CommonsWare

+0

良い点。私は議論のためにいくつかのフィールドを追加しました。私は、一致するvendorId(この場合はString)を持つものとして重複エントリを定義します。 – andsec

+0

それをプライマリキーにします。または、[一意のインデックス](https://developer.android.com/topic/libraries/architecture/room.html#entities-indices- u​​niqueness)を追加します。 – CommonsWare

答えて

1

プライマリキーとして必要な場合は、自動生成プライマリキーのみを使用してください。あなたのデータが自然な主キーを持っているなら、それを使用して、REPLACEが行うことに関して一意性を決定します。

自動生成された主キーを必要としますが、他の列(または列の組み合わせ)も一意にする場合は、列にa unique indexを追加します。これもまたREPLACEに影響します。

+0

OnUpdate = CASCADEは重複するエントリを置き換えます。このリンクは、複数のカラムに一意性を適用する方法について説明しています。https://developer.android.com/training/data-storage/room/defining-data.html#indices-uniqueness – xrnd

関連する問題