Миграция базы данных комнат неправильно обрабатывает конверсию - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь перейти с Sqlite на Room, но получаю ошибку миграции, я думаю, это связано с тем, что я использовал VARCHAR () (я следовал руководству, определенно хотел бы, чтобы я просто использовал TEXT, но не могу исправить это сейчас).

Вот моя сущность:

@Entity(tableName = "conversation")
class Conversation(@PrimaryKey
               @ColumnInfo(name = "key") val key: Int,
               @ColumnInfo(name = "message_id") val messageId: String?,
               @ColumnInfo(name = "thread_id") val threadId: String?,
               @ColumnInfo(name = "address") val address: String?,
               @ColumnInfo(name = "group_address") val groupAddress: String?,
               @ColumnInfo(name = "name") val name: String?,
               @ColumnInfo(name = "group_name") val groupName: String?,
               @ColumnInfo(name = "body") val body: String?)

Вот ошибка, которую я получаю:

Expected:
TableInfo{name='conversation', columns={date=Column{name='date', type='INTEGER', notNull=false, primaryKeyPosition=0}, address=Column{name='address', type='TEXT', notNull=false, primaryKeyPosition=0}.....
 Found:
TableInfo{name='conversation', columns={date=Column{name='date', type='INTEGER', notNull=false, primaryKeyPosition=0}, address=Column{name='address', type='VARCHAR(14)', notNull=false, primaryKeyPosition=0}....

И это всего лишь куча всего, и я не совсем уверен, как конвертировать VARCHAR в текст или что-то в этом роде

Редактировать: метод миграции

override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL(TexpertDatabase.CONVO_CREATE) //Creates table named conversation_temp with preferred schema
            database.execSQL("INSERT INTO conversation_temp SELECT ${TexpertDatabase.allCols} FROM conversation")
            database.execSQL("DROP TABLE conversation")
            database.execSQL("ALTER TABLE conversation_temp RENAME TO conversation")
        }

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

В Room 1.1 добавлена ​​поддержка типов Sqlite, которых не было в Room, поэтому исправлены все проблемы, кроме первичного ключа. В конечном итоге это была миграция, которая сработала, чтобы решить проблему, потребовав много усилий, но вот код, который, наконец, сработал, если у кого-то еще есть такая проблема:

override fun migrate(database: SupportSQLiteDatabase) {
        //Creates table named conversation_temp with copy of table from before, and adds a PRIMARY KEY AUTO INCREMENT to that
        database.execSQL(TexpertDatabase.CONVO_CREATE) 
        database.execSQL("INSERT (column, names, listed) INTO conversation_temp SELECT * FROM conversation")
        database.execSQL("DROP TABLE conversation")
        database.execSQL("ALTER TABLE conversation_temp RENAME TO conversation")
    }
0 голосов
/ 30 апреля 2018

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

  • переименование таблицы
  • добавление нового столбца.

Итак, стандартный (и, возможно, единственный) способ сделать это -

  1. создать временную таблицу с нужной схемой
  2. скопировать все данные из старой таблицы в эту новую таблицу
  3. удалить старую таблицу
  4. переименуйте новую таблицу в нужное имя

Весь этот код входит в функцию migrate Миграции, которую вы будете предоставлять комнате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...