Лучший способ создания объекта Android Room Entity для вставки без указания автоматически сгенерированного PK? (Котлин) - PullRequest
0 голосов
/ 21 октября 2019

В Android, при использовании базы данных Room и автоматически сгенерированном первичном ключе, ваш pk будет полем объекта и, следовательно, должен быть установлен при создании простого старого объекта Kotlin. Итак, что является правильным и чистым способом создания экземпляра объекта, который вы используете для вставки ?

Скажем, у вас есть такая таблица:

@Entity(tableName = "data")
class Data(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Long,
    @ColumnInfo(name = "some_data") val someData: Int
)

Если вы хотитечтобы на самом деле вставить Data объект, вам нужно будет указать id при инициализации.

Я вижу две возможности, и я не уверен, что любой из них правильный:

  • Назначитьэто фиктивная ценность. Будет ли Room генерировать реальный для вас, когда он фактически вставит его в базу данных?
  • Измените тип поля на Int? и всегда устанавливайте его значение на null.

1 Ответ

0 голосов
/ 21 октября 2019

Если в пределах Дао есть: -

@Insert
fun insertDataRow(data: Data): Long
  • Таким образом, будет возвращен идентификатор вставленной строки

, а затем используйте

insertedId = myMado.insertDataRow(0,10)

вставленный идентификатор будет сгенерированным идентификатором.

Если вы используете Int? , тогда вы можете использовать

insertedId = myMado.insertDataRow(null,10)

Если с Int? если вы использовали (без существующих данных)

insertedId = myMado.insertDataRow(0,10)
insertedId = myMado.insertDataRow(0,11)

Вы получите исключение UNIQUE для второй вставки, так как id имеет значение 0.

То есть, если вы используете Int? , в отличие от Int , есть небольшое изменение. Int эффективно обрабатывает 0 как ноль, тогда как Int? рассматривает 0 как значение 0

  • PS В идеале вам следует использовать Long или Long? для id , поскольку это может быть 64-разрядное целое число со знаком.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...