【问题标题】:Migrating to room, app crashes on startup with exception迁移到房间,应用程序在启动时崩溃并出现异常
【发布时间】:2018-01-30 04:03:37
【问题描述】:

这是应用程序的代码: https://github.com/sandy-8925/Checklist/tree/room_db

当我构建并启动它时,应用程序总是崩溃并出现以下异常。请注意,我已经有了这个应用程序的早期版本和普通的 Sqlite DB

原因:java.lang.IllegalStateException:迁移不正确 处理项目(org.sanpra.checklist.activity.ChecklistItem)。 预期的: TableInfo{name='items', columns={checked=Column{name='checked', 类型='整数',notNull=true,primaryKeyPosition=0}, _id=Column{name='_id', type='INTEGER', notNull=true, primaryKeyPosition=1}, desc=Column{name='desc', type='TEXT', notNull=false,primaryKeyPosition=0}},foreignKeys=[],indices=[]} 成立: TableInfo{name='items', columns={checked=Column{name='checked', 类型='整数',notNull=true,primaryKeyPosition=0}, _id=Column{name='_id', type='integer', notNull=false, primaryKeyPosition=1}, desc=Column{name='desc', type='text', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}

在 org.sanpra.checklist.dbhelper.ItemsDatabase_Impl$1.validateMigration(ItemsDatabase_Impl.java:66) 在 android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:75) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:118) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:299) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93) 在 android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54) 在 android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:193) 在 org.sanpra.checklist.activity.ItemsDao_Impl.fetchAllItems(ItemsDao_Impl.java:229) 在 org.sanpra.checklist.activity.ChecklistItemsCursorLoader.loadInBackground(ChecklistItemsCursorLoader.java:46) 在 org.sanpra.checklist.activity.ChecklistItemsCursorLoader.loadInBackground(ChecklistItemsCursorLoader.java:32) 在 android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:306) 在 android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:59) 在 android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:47) 在 android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:138) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266)

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    预期

    TableInfo{name='items', columns={checked=Column{name='checked', 类型='整数',notNull=true,primaryKeyPosition=0}, _id=Column{name='_id', type='INTEGER', notNull=true, primaryKeyPosition=1}, desc=Column{name='desc', type='TEXT', notNull=false,primaryKeyPosition=0}},foreignKeys=[],indices=[]}

    找到

    TableInfo{name='items', columns={checked=Column{name='checked', 类型='整数',notNull=true,primaryKeyPosition=0}, _id=Column{name='_id', type='integer', notNull=false, primaryKeyPosition=1}, desc=Column{name='desc', type='text', notNull=true,primaryKeyPosition=0}},foreignKeys=[],indices=[]}

    _id 可以为空,但 Room 期望它不为空。

    desc 不为空,但 Room 预计为空

    【讨论】:

    • 谢谢,我自己也注意到了。我通过添加一个迁移来修复它,在该迁移中我使用 Room 预期的模式重新创建了表(同时使用中间临时表来保存数据)。不幸的是,Room 不允许我们手动为实体字段指定“非空”状态,并且自动期望主键被声明为非空,即使如果我们使用通常的 Android Sqlite 代码我们必须手动指定它.
    • 现在可能为时已晚,但 Room 应该允许您指定可空性。您可能可以在 Java 上使用 NotNull 或 Nullable 注释。但我知道使用 kotlin 我可以设置 ?在变量上使其可以为空,并且 Room 尊重这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多