Я пытаюсь обновить базу данных комнаты, хочу добавить два столбца с существующей базой данных и не хочу потерять данные.
Имя моей существующей таблицы WordTable
@Entity
data class WordTable(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var word: String = "",
var des: String = "",
var bookmark: Boolean = false,
var addByUser: Boolean = false,
var uploaded: Boolean = false)
Iхочу добавить эти два столбца, поэтому мой код теперь
@Entity
data class WordTable(
@PrimaryKey(autoGenerate = true)
var id: Int = 0,
var word: String = "",
var des: String = "",
var ref: String = "Added by user",
var recent: Date = Date(),
var bookmark: Boolean = false,
var addByUser: Boolean = false,
var uploaded: Boolean = false)
Примечание: я предоставляю преобразователь даты
Создайте новую таблицу
database.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT," +
" word TEXT," +
" des TEXT," +
" ref TEXT," +
" recent INTEGER," +
" bookmark INTEGER," +
" addByUser INTEGER," +
" uploaded INTEGER)")
Скопируйте предыдущие данные
database.execSQL("Insert Into USER (id, word, des, bookmark, addByUser, uploaded) Select * From WordTable")
Удалить таблицу слов
database.execSQL("Drop Table WordTable")
Переименовать таблицу пользователя в WordTable
database.execSQL("Alter Table USER RENAME TO WordTable")
И я получаю эту ошибку;
Expected:
TableInfo{name='WordTable', columns={addByUser=Column{name='addByUser', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, word=Column{name='word', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, bookmark=Column{name='bookmark', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, uploaded=Column{name='uploaded', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, ref=Column{name='ref', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, des=Column{name='des', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, recent=Column{name='recent', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='WordTable', columns={addByUser=Column{name='addByUser', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}, word=Column{name='word', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, bookmark=Column{name='bookmark', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}, uploaded=Column{name='uploaded', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}, ref=Column{name='ref', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, des=Column{name='des', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, recent=Column{name='recent', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
разница между ожидаемым и найденным составляет
Expected: notNull=true
Found: notNull=false
, поэтому я пытаюсь изменить код создания таблицы
database.execSQL("CREATE TABLE `USER` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `word` TEXT NOT NULL, `des` TEXT NOT NULL, `ref` TEXT NOT NULL, `recent` INTEGER NOT NULL, `bookmark` INTEGER NOT NULL, `addByUser` INTEGER NOT NULL, `uploaded` INTEGER NOT NULL)")
Но на этот раз я получаю эту ошибку:
android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: USER.ref (Sqlite code 1299), (OS error - 2:No such file or directory)
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:742)
Я также пытаюсь изменить таблицу и столбец, но получаю ту же ошибку.
Как я могу это исправить?