【问题标题】:Room database error : IllegalStateException on Migration房间数据库错误:迁移时出现 IllegalStateException
【发布时间】:2020-11-28 11:03:42
【问题描述】:

我将 Room 持久性库用于我的数据库应用程序。我已经编写了一个迁移策略来向现有数据库添加一个新的表。我正面临以下错误。

错误:

java.lang.IllegalStateException: Migration didn't properly handle: table_audio_book(com.ridmik.app.audio_book.model.AudioBookInDb).
     Expected:
    TableInfo{name='table_audio_book', columns={book_path=Column{name='book_path', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, stream=Column{name='stream', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, user_id=Column{name='user_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_data=Column{name='audio_book_data', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_id=Column{name='audio_book_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_name=Column{name='audio_book_name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, stream_path=Column{name='stream_path', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, table_audio_book_row_id=Column{name='table_audio_book_row_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, last_closing_time=Column{name='last_closing_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}

     Found:
    TableInfo{name='table_audio_book', columns={user_id=Column{name='user_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_chapter_name=Column{name='audio_book_chapter_name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_data=Column{name='audio_book_data', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_id=Column{name='audio_book_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, audio_book_name=Column{name='audio_book_name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, row_id=Column{name='row_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, last_closing_time=Column{name='last_closing_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}

我的模型类:

@Entity(tableName = "table_audio_book")
data class AudioBookInDb (
        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "table_audio_book_row_id")
        val rowId: Long,

        @ColumnInfo(name = "audio_book_id")
        val bookId: Int,

        @ColumnInfo(name = "audio_book_name")
        val bookName: String,

        @ColumnInfo(name = "stream_path")
        val streamPath: String,

        @ColumnInfo(name = "book_path")
        val bookPath: String,

        @ColumnInfo(name = "stream")
        val stream: Boolean,

        @ColumnInfo(name = "audio_book_data")
        val audioBookData: String,

        @ColumnInfo(name = "user_id")
        val userId: Int,

        @ColumnInfo(name = "last_closing_time")
        val lastClosingTime: Long
)

我的迁移片段:

public static final Migration MIGRATION_6_7 = new Migration(6, 7) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        String createTableAudioBook = "CREATE TABLE IF NOT EXISTS `table_audio_book` (`table_audio_book_row_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                " `audio_book_id` INTEGER NOT NULL, `audio_book_name` TEXT, `book_path` TEXT, `stream_path` TEXT, `stream` INTEGER NOT NULL, `audio_book_data` TEXT," +
                " `user_id` INTEGER NOT NULL, `last_closing_time` INTEGER NOT NULL)";
        database.execSQL(createTableAudioBook);

        Timber.d("Upgrading Database from version 6 to 7");
    }
};

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 错误信息中的“找到的表信息”包含了在您创建表的迁移语句中不存在的列,例如:audio_book_chapter_name。这表明table_audio_book 已经存在,所以CREATE TABLE IF NOT EXISTS 什么都不做。尝试将 DROP TABLE IF EXISTS table_audio_book 添加到您的迁移中。
  • @BobSnyder 谢谢老兄。像魅力一样工作!问题是我在创建表时使用了fallbackDestructiveMigration()。所以它工作得很好。后来当我尝试在其上添加迁移时,因为已经创建了表,所以出现了这个问题。你的回答成功了。

标签: android android-room database-migration


【解决方案1】:

正如@BobSnyder 所说,我已经通过先删除表格并重新创建表格来解决它。它就像一个魅力。所以我把他的评论作为答案,以防将来有人需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2021-08-13
    • 2021-09-02
    • 2019-12-03
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多