Примитивные типы NonNull для переноса комнаты Android

Я переношу приложение, унаследованное мной от SQLOpenHelper, в Room, и у меня возникла проблема с сопоставлением одной из моих таблиц.

У меня есть сценарий

CREATE TABLE user_groups (
   _id TEXT PRIMARY KEY,
   is_default INTEGER DEFAULT 0 )

Мой класс Entity выглядит так

@Entity(tableName = "user_groups")
public class UserGroupModel {
   @Primary Key
   @NonNull
   @ColumInfo(name = "_id")
   private String rowId;

   @ColumnInfo(name = "is_default")
   private int isDefault;

   ..... constructor / getters .... 
}

Когда я перехожу к сборке с новой версией базы данных, я получаю сообщение об ошибке миграции.

IllegalStateException: миграция неправильно обрабатывала user_groups

Единственное несоответствие, которое я вижу в трассировке стека, - это то, что Room заставляет примитивные типы быть NOT NULL, а мой старый скрипт - нет.

Ожидал:

{name = 'is_default', type = 'INTEGER', affinity = '3', notNull = true, primaryKeyPosition = 0}

Нашел:

{name = 'is_default', type = 'INTEGER', affinity = '3', notNull = false, primaryKeyPosition = 0}

Room ожидает, что notNull будет истинным, но, поскольку скрипт не указал это, его ошибка. Это можно обойти? Или мне придется обновить все мои существующие таблицы с помощью сценария SQL, чтобы изменить эти столбцы INTEGER на NOT NULL, а затем выполнить миграцию. Это было бы много работы и действительно отстой!


person Le2e410    schedule 31.05.2018    source источник
comment
Вы нашли для этого решение?   -  person adriennoir    schedule 31.08.2019
comment
Да, в итоге я сделал именно то, что сказал, что не хочу делать в посте. При миграции я переименовал исходные таблицы в temp_table_name. Затем я воссоздал таблицу, но в скрипт создания поместил определенные ненулевые квалификаторы. Затем я скопировал все данные из временной таблицы в новую таблицу.   -  person Le2e410    schedule 06.09.2019
comment
Не могли бы вы предоставить правильный код или что-л. Я столкнулся с аналогичной проблемой   -  person Whiteq    schedule 19.09.2020


Ответы (1)


Вы можете написать это на Котлине:

@Entity(tableName = "user_groups")
data class UserGroupModel (
@Primary Key
@ColumInfo(name = "_id")
var rowId: String,
@ColumnInfo(name = "is_default")
var isDefault: Int?)
person Angelina    schedule 09.08.2018