Миграция с SQLite на Room: Миграция неправильно обрабатывает таблицу - PullRequest
0 голосов
/ 21 октября 2019

Итак, я использовал базу данных SQLite и решил перенести ее в Room, не меняя ее. Вот так выглядит моя модель комнаты

@Entity(tableName = "documents")
data class Document(
    @PrimaryKey(autoGenerate = true)
    val docID: Int,
    val path: String,
    val filename: String,
    val dateCreated: Long = MAX_VALUE,
)

, и этот запрос я использовал для создания таблицы ДО комнаты:

"CREATE TABLE IF NOT EXISTS documents (docID INTEGER PRIMARY KEY ASC, path TEXT NOT NULL unique, filename TEXT NOT NULL, dateCreated LONG DEFAULT MAX_VALUE)"

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

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
    override fun migrate(database: SupportSQLiteDatabase) {

    }
}

так, когда я наконец запустил ее на устройстве, на котором было предыдущее(9) версия базы данных, выдается исключение:

java.lang.IllegalStateException: Migration didn't properly handle: documents.
Expected: TableInfo{name='documents', columns={path=Column{name='path', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}

Found: TableInfo{name='documents', columns={path=Column{name='path', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, filename=Column{name='filename', type='STRING', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='null'}, dataCreated=Column{name='dataCreated', type='LONG', affinity='1', notNull=false, primaryKeyPosition=0, defaultValue='9223372036854775807'}, docID=Column{name='docID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}

существуют различия между типами полей пути и имени файла, которые, как ожидается, будут TEXT , но на самом деле это STRING , а также тип dateCreated, который, как ожидается, будет INTEGER , но на самом деле LONG . Интересная часть для меня - то, что dateCreated имел тип задолго до этого и все еще имеет тип long. Я попытался добавить миграцию, которая выглядит следующим образом:

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
    override fun migrate(database: SupportSQLiteDatabase) {
        val tableDocumentsTemp = "documents_temp"
        database.execSQL("ALTER TABLE documents RENAME TO $tableDocumentsTemp")
        database.execSQL("CREATE TABLE documents (docId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, path STRING NOT NULL, filename STRING NOT NULL, dateCreated LONG DEFAULT $MAX_VALUE)")
        database.execSQL("INSERT INTO documents (docId, path, filename, dateCreated) SELECT docId, path, filename, dateCreated FROM $tableDocumentsTemp")
        database.execSQL("DROP TABLE $tableDocumentsTemp")
        }
    }
}

, но это не имеет значения.

У кого-нибудь есть идеи, как я могу это исправить?

1 Ответ

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

Когда вы пишете код переноса базы данных комнаты, вы должны использовать TEXT для String и INTEGER для длинного типа данных.

private val MIGRATION_9_10: Migration = object : Migration(9, 10) {
override fun migrate(database: SupportSQLiteDatabase) {
    val tableDocumentsTemp = "documents_temp"
    database.execSQL("CREATE TABLE $tableDocumentsTemp (docId INTEGER NOT NULL, path TEXT NOT NULL, filename TEXT NOT NULL, dateCreated INTEGER DEFAULT $MAX_VALUE NOT NULL, PRIMARY KEY(docId))")
    database.execSQL("INSERT INTO $tableDocumentsTemp (docId, path, filename, dateCreated) SELECT docId, path, filename, dateCreated FROM documents")
    database.execSQL("DROP TABLE documents")
    database.execSQL("ALTER TABLE $tableDocumentsTemp RENAME TO documents")
    }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...