(Android) Миграция базы данных комнаты не меняет базу данных - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно обновить SQLite-Database, поэтому я создал миграцию.При пошаговой отладке этой миграции ошибки нет, но, как я вижу, обновляется только файл журнала.Изменение никогда не передается в базу данных, и я не совсем понимаю, что я сделал неправильно, поэтому, возможно, кто-то может дать совет .?

У меня есть таблица с именем 'image', и мне нужно создать таблицу с именем«привязанность».После этого мне нужно переместить все данные из «изображения» в «вложение», обработать / преобразовать некоторые данные и, наконец, удалить таблицу «изображение».

Вот моя реализация:

1.Я добавил библиотеку в свой проект

    implementation android.arch.persistence.room:runtime:1.0.0
    implementation android.arch.persistence.room:compiler:1.0.0

2.создать миграцию

    val MIGRATION_2_3: Migration = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {

    // create table 'attachment'
    database.execSQL("CREATE TABLE attachment (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, extenal_id INTEGER NOT NULL, userId TEXT, createdDateTime TEXT, displayFileName TEXT, fileExtension TEXT NOT NULL, noData INTEGER, identifier TEXT, commentText TEXT, localBaseFileName TEXT, dirty INTEGER NOT NULL, task_id TEXT NOT NULL, attachmentType INTEGER NOT NULL)")

    // migrate data from table 'image' to 'attachment'
    val cursor = database.query("SELECT * FROM image")
    cursor.moveToFirst()
    while (!cursor.isAfterLast) {

        // get stored values
        val image_id = cursor.getInt(0)
        val externalId = cursor.getLong(1)
        val customIdentifier = cursor.getString(2)
        val createdAt = cursor.getString(3)
        val imageType = cursor.getString(4)
        val commentText = cursor.getString(5)
        val createdBy = cursor.getString(6)
        // cursor.getString(7)/ / not used anymore
        val imageName = cursor.getString(8)
        val dirty = cursor.getInt(9)
        val task_id = cursor.getString(10)
        // cursor.getString(11) // not used anymore 

        // create migration only for availably images
        if (!imageName.isNullOrEmpty()) {

            // get file extension or 'unknown' if not known
            val fileExtension = MimeTypeMap.getSingleton().getExtensionFromMimeType(imageType) ?: "unknown"

            val contentValues = ContentValues()
            contentValues.put("id", image_id)
            contentValues.put("external_id", externalId)
            contentValues.put("userId", createdBy)
            contentValues.put("createdDateTime", createdAt)
            contentValues.put("displayFileName", imageName)
            contentValues.put"fileExtension", fileExtension)
            contentValues.put"noData", false)
            contentValues.put("identifier", customIdentifier)
            contentValues.put("commentText", commentText)
            contentValues.put("localBaseFileName", imageName.split("_")[0])
            contentValues.put("dirty", dirty)
            contentValues.put("task_id", task_id)
            contentValues.put("attachmentType", DatabaseManager.ATTACHMENT_TYPE_IMAGE)

            // insert new data
            database.insert("attachment", SQLiteDatabase.CONFLICT_REPLACE, contentValues)
        }

        // load next entry
        cursor.moveToNext()
    }
    cursor.close()

    // delete old table 'image'
    // database.execSQL("DROP TABLE image")



}

}

3.Добавлена ​​миграция в мою реализацию базы данных

     Room
            .databaseBuilder(context, Database::class.java, "my_db.db")
            .fallbackToDestructiveMigration()
            .addMigrations(MIGRATION_2_3)
            .build()

Когда я запускаю код, миграция вызывается без каких-либо ошибок.Но после миграции обновляется только файл журнала, а не сама база данных!?

Мне что-то здесь не хватает?Я не понимаю ..... ¯ \ _ (ツ) _ / ¯

1 Ответ

0 голосов
/ 02 июня 2018

Позор мне ...

Итак, вот мое решение или что пошло не так;)

Я всегда отлаживал процесс миграции и убивал процесс после завершения миграции ..... с результатом, описанным выше.

По крайней мере, мне нужно было сделать еще один шаг, чтобы увидеть, что в моем Entity-классе для Attachment и в SQL-операторе для создания таблицы во время была другая реализацияМиграция ...

Поле 'id' было создано со свойствами:

id AUTOINCREMENT INTEGER PRIMARY KEY NOT NULL

пока этот атрибутв сущности обнуляется!

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

Я не понимаю, почему журнал не объединяется непосредственно с базой данных после переноса, но хорошо, это простоЕще более утомительная вещь на Android;)

Надеюсь, это кому-нибудь поможет.

...