У меня есть исследования в Интернете, но я не могу найти какое -либо решение для следующей проблемы: < /p>
У меня есть приложение, которое использует базу данных комнаты. Версия комнаты = 2.6.1
После некоторого времени не используется или в неожиданных случаях приложение бросает следующее исключение: < /p>
Java.lang.illegalstateException: Комната не может проверить целостность данных. Похоже, вы изменили схему, но забыли обновить номер версии. Вы можете просто исправить это, увеличив номер версии. Ожидаемый идентификационный хэш: 33163C2D5EEE97B7482F9E26308BF995, найдено: null
Схема вообще не была изменена.
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
open class RoomOpenHelper(
configuration: DatabaseConfiguration,
delegate: Delegate,
identityHash: String,
legacyHash: String
) : SupportSQLiteOpenHelper.Callback(delegate.version) {
private var configuration: DatabaseConfiguration?
private val delegate: Delegate
private val identityHash: String
..................
..................
..................
..................
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
checkIdentity(db)
delegate.onOpen(db)
// there might be too many configurations etc, just clear it.
configuration = null
}
private fun checkIdentity(db: SupportSQLiteDatabase) {
if (hasRoomMasterTable(db)) {
val identityHash: String? = db.query(
SimpleSQLiteQuery(RoomMasterTable.READ_QUERY)
).useCursor { cursor ->
if (cursor.moveToFirst()) {
cursor.getString(0)
} else {
null
}
}
if (this.identityHash != identityHash && this.legacyHash != identityHash) {
throw IllegalStateException(
"Room cannot verify the data integrity. Looks like" +
" you've changed schema but forgot to update the version number. You can" +
" simply fix this by increasing the version number. Expected identity" +
" hash: ${ this.identityHash }, found: $identityHash"
)
}
} else {
// No room_master_table, this might an a pre-populated DB, we must validate to see if
// its suitable for usage.
val result = delegate.onValidateSchema(db)
if (!result.isValid) {
throw IllegalStateException(
"Pre-packaged database has an invalid schema: ${result.expectedFoundMsg}"
)
}
delegate.onPostMigrate(db)
updateIdentity(db)
}
}
private fun updateIdentity(db: SupportSQLiteDatabase) {
createMasterTableIfNotExists(db)
db.execSQL(RoomMasterTable.createInsertQuery(identityHash))
}
private fun createMasterTableIfNotExists(db: SupportSQLiteDatabase) {
db.execSQL(RoomMasterTable.CREATE_QUERY)
}
< /code>
В базе данных на устройстве есть rap_master_table существует, но является пустой.
room пытается сравнить идентификацию_hash текущей схемы с идентификацией_hash, хранящейся в базе данных и не сбои. Если TRUE, он сравнивает идентификацию_HASH, а если нет, он пытается воссоздать таблицу с помощью Identity_hash
, поскольку в моем случае таблица существует, но она пуста, она бросает нелегальное организацию. < /p>
. Это происходит после того, как пользователь использует приложение и оставляет его на некоторое время. Мне не нравится такое решение, поэтому я хотел бы знать, что кто -то столкнулся с той же проблемой или есть обходной путь.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... rity-issue
RoomDatabase - Комната не может проверить проблему целостности данных ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение