У нас есть процесс инициализации, который происходит, когда отображается экран spla sh. Часть этой инициализации включает в себя настройку Realm.
Мы используем шифрование для Realm и устанавливаем encryptionKey
при построении с использованием RealmConfiguration.Builder()
. Мы изменили как генерировать ключ шифрования, чтобы у пользователей, которые обновляют приложение, была база данных Realm, к которой больше нельзя получить доступ (из-за измененного ключа). Во время инициализации мы пытаемся открыть экземпляр Realm, и если происходит RealmFileException - Unable to open a realm at path: Realm file decryption failed
, мы пытаемся удалить базу данных Realm. Некоторый код:
fun setupRealm() {
Realm.init(context)
val realmFileName = "mydb.realm"
val key = EncryptDecryptHelper.loadKey(spHelper)
val version = 1L
val defaultConfig = RealmConfiguration.Builder().apply {
name(realmFileName)
encryptionKey(key)
schemaVersion(version)
deleteRealmIfMigrationNeeded()
}.build()
Realm.setDefaultConfiguration(defaultConfig)
try {
Realm.getInstance(defaultConfig).close()
} catch (exception: RealmFileException) {
var instances = Realm.getGlobalInstanceCount(defaultConfig)
Log.d("Testing", "Instances $instances")
RollbarHelper.logWarning("Failure while reading realm file", exception.toString(), spHelper)
Realm.deleteRealm(Realm.getDefaultConfiguration()!!)
}
}
Мы видим, что от наших пользователей поступают некоторые исключения:
java .lang.IllegalStateException: не разрешается удалять файл, связанный с открытое Царство. Не забудьте закрыть () все экземпляры Царства перед удалением его файла.
Это, конечно, указывает на строку Realm.deleteRealm(Realm.getDefaultConfiguration()!!)
и предполагает, что экземпляры Царства необходимо закрыть перед удалением Царства. Тем не менее, этот блок выполняется только , если открытие Царства не удается , что означает, что Царство должно быть невозможно открыть.
Вопросы:
- Что может быть причиной
IllegalStateException
с, учитывая, что для Королевства должно быть невозможным открытие в этой точке, как описано выше? - Можно ли проверить, действителен ли ключ шифрования до попытки открыть экземпляр Realm?