Aman Grover
Aman Grover

Reputation: 1641

How to insert a duplicate row in Room Db?

While searching for this, I only came across people asking how to Avoid inserting duplicate rows using room db. But my app has a feature where the user may tap a copy button and the list item will get inserted again in the db. I could have simply achieved this if my table didn't have a primary key set on one of its fields. While I found this solution for SQLite, I don't know how I can achieve this in Room Db. Because while writing an insert query with custom queries in room would defeat the purpose of using room in the first place.

Upvotes: 0

Views: 1570

Answers (1)

sergiy tykhonov
sergiy tykhonov

Reputation: 5103

Let's say you have some entity

@Entity(tableName = "foo_table")
data class Foo (
    @PrimaryKey(autoGenerate = true) var id: Int,
    // or without autogeneration
    // @PrimaryKey var id: Int = 0,
    var bar:String
)

and you have some Dao with insert:

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(foo: Foo)

Then to copy your existing value (copiedValue: Foo) you need in some way to manage your primary key:

  1. Scenario 1. Your Primary Key is autogenerated, you have to set it to default value to get new autogenerated one:

    copiedValue.id = 0 yourDao.insert(copiedValue)

  2. Scenario 2. Your Primary Key is not autogenerated, you have to set new primary key manually:

    copiedValue.id = ... // some code to set new unique id yourDao.insert(copiedValue)

Upvotes: 2

Related Questions