Я исследовал идею параллельного сохранения каждого indexedDB сохранения с записью в файл в папке документов IOS App с надеждой, что это будет менее вероятно стерто, чем в папке Caches.
После каждого setItem indexedDB с парой ключ-значение я передаю запрос к коду приложения IOS Objective-C для создания текстового файла в подпапке, созданной с помощью папки документов приложения, с именем «key» .txt и содержимое установлено в значение.
После каждого indexIdB removeItem я передаю запрос в код приложения IOS Objective-C для удаления соответствующего текстового файла 'key'.txt.
После очистки каждой индексированной БД я удаляю всю созданную выше подпапку.
Теперь, когда приложение запускается и обнаруживает пустую базу данных localForage, я передаю запрос к коду IOS-приложения Objective-C, чтобы проверить, есть ли подпапка с ключевыми элементами или нет.
Если это не так, то это новая установка приложения, и в таком случае она продолжается как обычно.
если это так, то это случай, когда база данных indexedDB была удалена.
В таком случае я прошу код приложения IOS target-C вернуть набор ключей, изучив содержимое созданной выше папки и удалив бит .txt, а в случае IOS Simulator игнорируя DS_Store файл.
Один за другим я запрашиваю содержимое каждого файла ключей и загружаю их обратно в ранее пустую базу данных localForage, и когда это будет сделано, я могу продолжить, как если бы он не был удален.
Я обнаружил, что необходимо использовать тайм-аут нулевой длительности в javascript перед запросом каждого значения, чтобы предотвратить ошибки превышения стека вызовов при восстановлении больших баз данных.
Этот подход, кажется, работает, и я могу проверить это в любое время, используя действия на вкладке Ресурсы разработчика Safari, чтобы очистить базу данных, а затем вручную перезапустить приложение. Используя ту же вкладку, вы можете наблюдать за пополнением базы данных indexedDB.
Из-за размера моей базы данных я фактически создал набор подпапок с ключами разных типов, чтобы я мог выбрать порядок, в котором элементы базы данных были восстановлены, тем более что мое приложение часто возвращалось к жизни в фоновом режиме после значительного изменения местоположения, и в таких случаях установлен максимальный срок, который дается приложению для выполнения такого восстановления. Это уточнение, конечно, необязательно и необходимо только для больших баз данных.
Следующие примечания предназначены для тех, кто хочет попробовать этот подход и предполагает использование Objective C в XCode 10.1
- Используйте NSHomeDirectory () и stringByAppendingPathComponent @ "Documents", чтобы получить папку Documents.
- Используйте stringByAppendingPathComponent, чтобы создать путь к подпапке для подпапки ключей.
- Используйте fileExistsAtPath, чтобы проверить, существует ли подпапка ключей уже
- Используйте createDirectoryAtPath, если это не так.
- При сохранении или изменении элементов в indexedDB используйте stringByAppendingPathComponent для создания пути имени файла ключа, например, Base.txt для ключа 'Base'.
- Используйте fileHandleforWritingAtPath, чтобы получить fileHandle для файла
- если fileHandle не существует, необходимо создать его с помощью writeToFile для создания файла 'key'
- если fileHandle существует, то truncateFileAtOffseyt: 0 (важно), чтобы очистить его, а затем использовать writeData для создания новой версии файла 'key'.
- В обоих вышеперечисленных случаях укажите кодировку UTF8.
- При удалении элементов из indexedDB сделайте то же самое, чтобы получить путь к файлу ключа, а затем используйте removeItemAtPath.
- Устройство можно очистить, удалив всю подпапку с помощью removeItemAtPath.
- Процесс восстановления использует contentOfDirectoryAtPath для чтения набора ключей в подпапке.
- Процесс восстановления для каждого элемента использует stringWithContentsOfFile для чтения файлов данных и возврата содержимого, заключенного в кавычки, с использованием вызова stringByEvaluatingJavaScriptFromString
Надеюсь, это поможет.