Я считаю, что проблема заключается в использовании типа логический , как в public boolean archived = false;
.
Поскольку логический является основным типом Java, тогда он имеетнеявное @ NonNull (таблица создается с ограничением NOT NULL)
С помощью Room вы не можете (я верю) установить значения по умолчанию, которые генерируются в таблице SQLite, поэтому при использовании onDelete SET_DEFAULT
значение по умолчанию будет NULL , поскольку фактическое значение по умолчанию не задано.
- использование
= false
не влияет на фактическую таблицу SQLite, то есть на определение столбца, если используется Boolean , будет labelId INTEGER
, а не labelId INTEGER DEFAULT 0
.
Если предположить, что NULL является приемлемым, тогда вы можете использовать Boolean (Объект) вместо логического (основной тип).Объекты могут быть нулевыми.
т.е. в Сеанс использовать
public Boolean archived = false;
Визуальное объяснение: -
Ниже приведен код, сгенерированный Room,для Session Entity, но с добавленным дополнительным столбцом, используя: -
.........
public boolean archived = false;
public Boolean other_archived = false; //<<<<<<<<<< ADDED
........
Код, сгенерированный комнатой: -
CREATE TABLE IF NOT EXISTS `Session` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`label` TEXT,
`archived` INTEGER NOT NULL, /*<<<<<<<<<< boolean so NOT NULL */
`other_archived` INTEGER, /*<<<<<<<<<< Boolean so no NOT NULL */
FOREIGN KEY(`label`, `archived`) REFERENCES `Label`(`id`, `archived`) ON UPDATE CASCADE ON DELETE SET DEFAULT)
Extra
Если вы хотитедля архивированного столбца в таблице сеансов должно быть 0 (false), тогда вам придется изменить таблицу.Это повлечет за собой
- Создание таблицы замены, которая является такой же, за исключением того, что определение столбца метки будет
label INTEGER DEFAULT 0
(т. Е. Добавлено DEFAULT 0) - Копирование данных из сеансатаблицу в таблицу замены, например,
INSERT INTO replacement_Session SELECT * FROM Session;
- Переименование таблицы сеанса.
- Переименование таблицы замены в сеанс.
- В случае успеха Удалите переименованную таблицу сеанса.
В качестве альтернативы (я думаю) вы можете использовать AFTER UPDATE TRIGGER, чтобы изменить значение NULL на 0 (false).
Любой из этих вариантов необходимо будет выполнить за пределами Room или до того, как RoomDatabase будетвстроенный.