Как выполнить миграцию из базы данных SQLite в комнату с полем «Строка»? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь перенести базу данных из SQLite в Room в Android.

Но я получил ошибку:

Миграция не выполнена правильно обработать: staff_message (db.entity.StaffMessage). Ожидается: TableInfo {message = Column {name = 'message', type = 'TEXT', affinity = '2', notNull = true, primaryKeyPosition = 0, defaultValue = 'null'}} Найдено: TableInfo {message = Column {name = 'message', type = 'String', affinity = '1', notNull = true, primaryKeyPosition = 0, defaultValue = 'null'}}

Исходная таблица была записана так:

db.execSQL("CREATE TABLE IF NOT EXISTS staff_message( " +
                    "message String NOT NULL");");

И новая схема таблицы выглядит следующим образом:

@Entity(tableName = "staff_message")
data class StaffMessage(
        @ColumnInfo(name = "message") val message: String
)

Единственное отличие - это тип.

String VS. ТЕКСТ

Как перенести этот стол в Комнату?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

В SQLite нет типа данных, например String. Вы должны использовать TEXT

db.execSQL("CREATE TABLE IF NOT EXISTS staff_message( " + "message TEXT NOT NULL");");
0 голосов
/ 20 февраля 2020

Я должен был мигрировать сам.

static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // Create the new table
        database.execSQL(
                "CREATE TABLE users_new (userid TEXT, username TEXT, last_update INTEGER, PRIMARY KEY(userid))");
// Copy the data
        database.execSQL(
                "INSERT INTO users_new (userid, username, last_update) SELECT userid, username, last_update FROM users");
// Remove the old table
        database.execSQL("DROP TABLE users");
// Change the table name to the correct one
        database.execSQL("ALTER TABLE users_new RENAME TO users");
    }
};

Спасибо @ Raghunandan

...