kako.dev

開発、自作アプリのこと

Roomでデータを重複させない

Roomには重複を避ける方法紹介します。

やることは2つ

  • Entityにインデックスをつける
  • INSERT時 OnConflictStrategy.IGNORE をつける

Entityにインデックスをつける

Userデータがあると想定して、account_idの重複をさせないようにします。

@Entity(indices = Index(value = ["account_id"], unique = true))
data class User (
    @PrimaryKey(autoGenerate = true) val id: Int,
    @ColumnInfo(name = "account_id") val accountId: String,
    @ColumnInfo(name = "first_name") val firstName: String,
    @ColumnInfo(name = "last_name") val lastName: String
)

肝はunique = true の部分です。これをつけることでインデックスの値で重複を拒否されます。

INSERT時 OnConflictStrategy.IGNORE をつける

InsertにはデータがConflictした時の挙動を設定することができます。 単純に重複を許さないなら OnConflictStrategy.IGNORE でいいです。

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertUser(user: User)

他には データを置き換えるOnConflictStrategy.REPLACEトランザクションを中止するOnConflictStrategy.ABORTなどがあるので、どうしたいのかにより設定することができます。

参考

Room エンティティを使用してデータを定義する  |  Android デベロッパー  |  Android Developers

OnConflictStrategy  |  Android デベロッパー  |  Android Developers