Миграции Android Room не были обработаны должным образом - PullRequest
0 голосов
/ 14 сентября 2018

Я написал миграцию Android Room, но почему-то она не справляется должным образом.

Вот ошибка:

    Expected:
TableInfo{name='Likes', columns={creatorId=Column{name='creatorId', type='TEXT', notNull=false, primaryKeyPosition=0}, messageId=Column{name='messageId', type='TEXT', notNull=false, primaryKeyPosition=0}, createdAt=Column{name='createdAt', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='TEXT', notNull=false, primaryKeyPosition=0}, dbId=Column{name='dbId', type='INTEGER', notNull=true, primaryKeyPosition=1}, timestamp=Column{name='timestamp', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
 Found:
TableInfo{name='Likes', columns={dbId=Column{name='dbId', type='INTEGER', notNull=true, primaryKeyPosition=1}, creatorId=Column{name='creatorId', type='TEXT', notNull=false, primaryKeyPosition=0}, messageId=Column{name='messageId', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='TEXT', notNull=false, primaryKeyPosition=0}, timestamp=Column{name='timestamp', type='TEXT', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

Вот скрипт миграции:

database.execSQL("CREATE TABLE Likes (id TEXT, creatorId TEXT, messageId TEXT,"
                       + " timestamp TEXT, dbId INTEGER NOT NULL, PRIMARY KEY(dbId))");

Вот класс модели:

@Entity(tableName = "Likes")
public class LikeDbModel {

@PrimaryKey private int dbId;
private String id;
private String creatorId;
private String messageId;
private String timestamp;
private String createdAt;

public LikeDbModel() {
}
}

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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

INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        YourDatabase.class, "your_database.db")
                        .addMigrations(
                                MIGRATION_1_2
                        )
                        .build();

Затем выполните миграцию правильно, сначала отбросив таблицу, а затем создав ее.или используя оператор alter table.

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase db) {
           //Either
           db.execSQL("drop table Likes"); //if existing table
           db.execSQL("CREATE TABLE Likes (id TEXT, creatorId TEXT, messageId TEXT,"
                   + " timestamp TEXT, createdAt TEXT, dbId INTEGER NOT NULL, PRIMARY KEY(dbId))")

            //or
            db.execSQL("alter table add createdAt TEXT");

    }
};

Ошибка, которую вы получаете, заключается в том, что room сравнивает вашу сущность с существующей таблицей в базе данных.Вы также можете заключить операторы миграции в SQLiteException try / catch, чтобы увидеть, что работает.

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

Документация по комнате: https://developer.android.com/training/data-storage/room/migrating-db-versions

0 голосов
/ 14 сентября 2018

В миграции отсутствует поле createAt

...