База данных, зашифрованная SQLCipher в приложении для iOS, становится постоянно недоступной
Недавно я изменил свое приложение для iOS, чтобы включить сериализованный режим для базы данных, зашифрованной с помощью SQLCipher, и незашифрованной базы данных (также SQLite). Я также поддерживаю статическое соединение sqlite3 для каждой базы данных, и каждая из них открывается только один раз (просто проверяя нулевые значения) и распределяется в течение всего времени жизни приложения.
Приложение должно иметь синхронизирующее поведение, которое будет загружать тонну записей из удаленной базы данных через регулярные промежутки времени, используя запрос мыла, и обновлять содержимое локальной зашифрованной базы данных. Конечно, человек, использующий приложение, может или не может обновлять или читать из базы данных, в зависимости от того, что они делают, поэтому я внес изменения, упомянутые в предыдущем абзаце.
При проведении краткосрочного тестирования, похоже, не возникает проблем с тем, как все работает, и у меня еще не было никаких проблем.
Однако некоторые пользователи сообщают, что потеряли доступ к зашифрованной базе данных, и я пытаюсь выяснить, почему.
Мои мысли следующие: методы, написанные другим разработчиком, объявили все sqlite3_stmt как статические (я полагаю, этот код был в проблемной версии). В прошлом я замечал сбои, когда два потока, использующие определенный метод, запускаются одновременно. Один поток завершает, изменяет или заменяет sqlite3_stmt, в то время как другой поток использует его. Не всегда происходит сбой, потому что он завернул большую часть своего кода SQLite в блоки try/catch. Если это правда, что SQLite использует подготовку и финализацию для реализации блокировки, может ли потерять значение sqlite3_stmt из-за их статической природы в этом контексте переводить базу данных в неработоспособное состояние? Например, когда оператор получает монопольную блокировку после того, как шаг заменен назначением в том же методе, выполняющемся в другом потоке?
Я понимаю, что это не обязательно означает, что база данных станет постоянно непригодной для использования, но рассмотрим следующий сценарий:
В какой-то момент в течение времени жизни приложения оно перекодирует зашифрованную базу данных, и этот ключ сохраняется в другой базе данных. Предположим, что он успешно перекодирует зашифрованную базу данных, но тогда новый ключ не сохраняется в другой базе данных из-за того, что я упомянул выше. При условии, что база данных не была повреждена в какой-то момент (я на самом деле не рассчитываю на это), это единственное объяснение, которое я могу придумать, почему пользователь не сможет использовать зашифрованную базу данных после перезапустите приложение iOS, видя, что приложение будет единственным, чтобы получить доступ к файлу базы данных.
Поскольку я не могу воссоздать эту проблему, я могу только догадываться о том, какие могут быть причины. Какие у тебя мысли? Похоже ли это на правдоподобный сценарий того, что случается редко? У вас есть другая идея о чем-то посмотреть?
1 ответ
Если база данных повторно введена, и ключ для базы данных не был успешно сохранен в другой базе данных, то это, безусловно, может вызвать проблему.