База данных комнат переопределяет вставленные объекты

У меня есть объект объекта следующим образом:

@Entity(tableName = "woks", foreignKeys = arrayOf(ForeignKey(
    entity = Order::class,
    parentColumns = arrayOf("entryid"),
    childColumns = arrayOf("order_id"),
    onDelete = ForeignKey.CASCADE
)))
data class Wok(
    val order_id: String
) {
    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0
}

и вставка в мой файл DAO определяется следующим образом:

@Insert(onConflict = OnConflictStrategy.IGNORE)
abstract fun insertWok(wok: Wok): Long

Как вы можете видеть, конфликт игнорируется, поэтому, когда я когда-либо пытался снова вставить один и тот же объект, он переопределял этот объект и продолжал увеличивать идентификатор.

Итак, чего я хочу добиться, так это вставить один и тот же объект столько раз


person Oussaki    schedule 20.11.2017    source источник
comment
Есть ли конкретная причина, по которой вы хотите дублировать строки в таблице?   -  person Samuel Robert    schedule 20.11.2017
comment
@Oussaki: удалить (onConflict = OnConflictStrategy.IGNORE). Затем каждый раз, когда вы вставляете этот объект, он будет создавать новую строку с новым идентификатором в базе данных.   -  person Willi Mentzel    schedule 20.11.2017
comment
@WilliMentzel я пробовал, но результат тот же   -  person Oussaki    schedule 20.11.2017
comment
@Oussaki, пожалуйста, покажи свои звонки InsertWok   -  person Willi Mentzel    schedule 20.11.2017


Ответы (2)


Чтобы вставлять свой объект много раз, вам нужно изменить первичный ключ. Комната основана на нем, чтобы узнать, новый это объект или нет.

person Lionel    schedule 20.11.2017
comment
Но первичный ключ — это увеличенное значение! - person Oussaki; 20.11.2017
comment
Я видел это. Но если вы запросите БД, чтобы получить вок, а затем попытаетесь вставить его, это не сработает, потому что оба объекта имеют одинаковый идентификатор. Поэтому вам нужно очистить идентификатор для этого нового объекта или создать клон объекта, поступающего из БД (без идентификатора), чтобы позволить комнате сгенерировать новый идентификатор. - person Lionel; 20.11.2017

Я пробовал много комбинаций, которые возможны с вашей информацией, но ничего не получилось, как вы говорите.

Не могли бы вы поделиться дополнительной информацией, например, о вашем конструкторе, о том, как вы создаете рабочий объект, что на самом деле происходит с выводом (до и после)

Это может произойти, если идентификатор вашего рабочего объекта равен 0 при переходе к вашему методу insertWork, если вы поместите 2 идентичных объекта с идентификатором 0 из обоих, поскольку autogenrate=true комната будет автоматически генерировать идентификатор для них, и поскольку комната создаст уникальный идентификатор, эти объекты рассматриваются как разные объекты.

person kunal khedkar    schedule 10.07.2018
comment
@ Andrzej Ziółek .... вы читали мой полный ответ? Во второй части я объяснил, в чем может быть проблема. так что перестаньте отвечать таким образом. Я провел некоторый тест по этому сценарию, после чего написал свой ответ. Если у вас есть ответ, почему бы вам не ответить на него. Если нет .. выкл. - person kunal khedkar; 11.07.2018