房间数据库迁移崩溃
Room Database migration crash
我有一个数据库迁移:
val MIGRATION_8_9 = object : Migration(8, 9) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE RideEntity RENAME frontVideoPresent TO frontVideoState")
database.execSQL("ALTER TABLE RideEntity RENAME rearVideoPresent TO rearVideoState")
}
}
在本地三星 phone 上测试此迁移时,它运行良好。在 craslytics 的帮助下,我在生产中看到了这个崩溃:
Fatal Exception: java.lang.RuntimeException
Exception while computing database live data.
Caused by android.database.sqlite.SQLiteException
near "frontVideoPresent": syntax error (Sqlite code 1 SQLITE_ERROR): , while
compiling: ALTER TABLE RideEntity RENAME frontVideoPresent TO frontVideoState, (OS
error - 11:Try again)
这发生在华为 Mate 20 phone 上。如何更好地理解这次崩溃?这跟OS有关?
我现在无法删除重命名,因为许多更新应用程序的用户在重命名列时有效,但使用华为 phones 的用户可能会遇到此崩溃。
我愿意接受你的建议...
看起来某些设备上的 sqlite 版本不支持列重命名,因为 android 应用程序使用 sqlite 库上的内置版本 android OS。这就是为什么 sqlite 的版本取决于 android 的 api 级别版本(其中 app 运行)。 According to sqlite release notes (paragraph 2) the support for renaming columns was added in version 3.25.0 and according to google docs (and other answer on Whosebug)自 android api 级别 30 起支持 android 上的列重命名。
解决slqlite库碎片问题可以使用android-requery which allows to use last version of sqlile in all android versions(since API level 14). It's easy to use this library with room.
我有一个数据库迁移:
val MIGRATION_8_9 = object : Migration(8, 9) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE RideEntity RENAME frontVideoPresent TO frontVideoState")
database.execSQL("ALTER TABLE RideEntity RENAME rearVideoPresent TO rearVideoState")
}
}
在本地三星 phone 上测试此迁移时,它运行良好。在 craslytics 的帮助下,我在生产中看到了这个崩溃:
Fatal Exception: java.lang.RuntimeException
Exception while computing database live data.
Caused by android.database.sqlite.SQLiteException
near "frontVideoPresent": syntax error (Sqlite code 1 SQLITE_ERROR): , while
compiling: ALTER TABLE RideEntity RENAME frontVideoPresent TO frontVideoState, (OS
error - 11:Try again)
这发生在华为 Mate 20 phone 上。如何更好地理解这次崩溃?这跟OS有关? 我现在无法删除重命名,因为许多更新应用程序的用户在重命名列时有效,但使用华为 phones 的用户可能会遇到此崩溃。 我愿意接受你的建议...
看起来某些设备上的 sqlite 版本不支持列重命名,因为 android 应用程序使用 sqlite 库上的内置版本 android OS。这就是为什么 sqlite 的版本取决于 android 的 api 级别版本(其中 app 运行)。 According to sqlite release notes (paragraph 2) the support for renaming columns was added in version 3.25.0 and according to google docs (and other answer on Whosebug)自 android api 级别 30 起支持 android 上的列重命名。
解决slqlite库碎片问题可以使用android-requery which allows to use last version of sqlile in all android versions(since API level 14). It's easy to use this library with room.