Akavache не сохраняет данные кэша между перезапусками приложения
У меня есть проект Xamarin для Android, использующий общую библиотеку PCL, и я решил использовать Akavache в качестве временного хранилища данных (для хранения некоторой простой информации о состоянии входа в систему, чтобы каждый раз сохранять журнал).
Поэтому я добавил пакеты nuget Akavache и Akavache.Sqlite3 в общую библиотеку (и в проект Xamarin.Android). Я установил BlobCache.ApplicationName
даже звонил EnsureInitialized
(хотя это, кажется, не делает больше, чем запись сообщения).
Я развернул приложение на устройстве. Запустил его вручную (чтобы не было очистки данных, настроек и т. Д.). Данные кэшируются (и извлекаются) до тех пор, пока приложение работает. Выдает исключения (как и ожидалось), если ключи отсутствуют. Все работает отлично.
Затем я закрыл приложение (однажды я даже перезагрузил телефон). Когда я его перезапустил, кеш либо пуст, либо переинициализирован. В любом случае, все, что я кэшировал, ушло.
Я посмотрел в отладчике, где хранятся кэширующие файлы sqlite3, и приложение сообщает мне, что они, по-видимому, data/data/packagename/cache/xyzblobs.db
, Я не вижу эти файлы, потому что они находятся во внутренней системной директории кеша / файлов приложений, поэтому я понятия не имею, стираются они или нет.
Я включил разрешения WRITE_EXTERNAL_STORAGE (и READ_). Нет кости. Я пытался использовать Secure
, UserAccount
а также LocalMachine
цели. Нада. Никто из них не работает.
Пока приложение работает (или в памяти), оно ведет себя как ожидалось. В тот момент, когда приложение исчезает, кэш также отключается.
Единственное, что я не сделал, это позвонил BlobStorage.Shutdown()
метод. И это потому, что я не знаю, как это назвать. У меня есть несколько видов деятельности, и я не хочу подсчитывать ссылки, потому что это глупо.
Изменить: Позже я вызвал звонок .Shutdown().Wait()
и это тоже не помогло.
Кто-нибудь еще испытывал это? Я знаю, по крайней мере, еще одного человека, у которого точно такая же проблема, подробно описанная здесь, на форумах Xamarin.
Я действительно не хочу вытаскивать все вещи из Akavache, потому что я использовал их раньше, в другом месте на не-Xamarin-Android, и это потрясающе. В противном случае мне придется начать искать какой-то менеджер общих настроек xplat, но я бы предпочел этого не делать, потому что Akavache должен делать именно это.
Изменить: вот некоторые из кода:
Инициализация (у меня есть статический общий класс "AppGlobal", который я использую для хранения вещей типа singleton)
public static class SharedAppGlobal
{
static SharedAppGlobal()
{
BlobCache.ApplicationName = SharedAppConstants.SharedAkavacheCacheName;
BlobCache.EnsureInitialized();
}
}
Это все работает нормально, если я запускаю его в отладчике и смотрю на BlobCache
он говорит мне, что я использую хранилище Sqlite3 и путь к нему (хотя файлы sqlite3.db мне не доступны на некорневом устройстве)
Я могу вызвать кеш получить / установить с такими вещами, как
currentCookie = await BlobCache.LocalMachine.GetObject<Cookie>("authCookie");
и написать их обратно с
await BlobCache.LocalMachine.InsertObject("authCookie", cookie);
Все вызовы Akavache выполняются в общей библиотеке. И не имеет значения, какой магазин я использую (Secure, UserAccount или LocalMachine), поведение такое же.
Все работает отлично. Затем я выхожу из приложения. Повторно откройте приложение (я могу перезагрузить телефон, чтобы убедиться, что оно пропало), и кэш пуст. Или сбросить. Или сделано заново. Я не знаю, какой, потому что я не могу видеть файлы.db.
Я НЕ работаю под отладчиком и не каждый раз меняюсь. Таким образом, каталоги развертывания не засоряются. Это происходит даже когда я устанавливаю apk. Я думаю, что это, вероятно, как-то связано с тем, что эти файлы БД находятся не там, где говорится, но я в полной растерянности.
Нужно ли реализовать что-то на уровне платформы и передать его в общую библиотеку? Я так не думаю, потому что все зависимости и пути, кажется, решены.
Я потратил часы на это.
Спасибо:)
3 ответа
Хорошо, я нашел обходной путь, который решает проблему для меня.
Сначала я попытался воспроизвести проблему, чтобы кто-то другой мог взглянуть на нее, и, конечно, она отлично работала в новом приложении. Цвет меня раздражал.
Итак, я попытался вручную создать экземпляр SQlitePersistentBlobCache
, давая ему конкретный путь для создания файлов БД по пути, который я могу контролировать и видеть, используя
GetExternalFilesDir(null).AbsolutePath + "test.db)
и это сработало! Кеш торчит даже между перезагрузками!
Это все еще не объясняет, почему у меня была первоначальная проблема, но сейчас это приемлемое для меня решение.
Я добавил решение для github по адресу https://github.com/wislon/xam-akavache-test.
master
филиал использует стандарт BlobCache
статический экземпляр.
instantiate-blobcache
ветвь использует экземпляр SQlitePersistentBlobCache
,
Если кому-то интересно, так оно и есть. К сожалению, я не могу тратить больше времени на выяснение того, почему готовый статический экземпляр делает то, что делает, потому что у меня есть продукт для сборки, но, надеюсь, это поможет кому-то еще.
У меня была та же проблема, и я решил ее, проверяя Сохранение данных / кеша приложения на устройстве между развертываниями в настройках.
В Visual Studio:
- Сервис> Параметры> (дерево слева) Xamarin > Настройки Android> установите флажок Сохранять данные / кэш приложения на устройстве между развертываниями
В студии Xamarin:
- (Windows) Инструменты> Параметры> Проекты> Android > отметьте Сохранить данные / кэш между развертываниями приложений
или же
- (OS X) Xamarin Studio > "Установки"> "Проекты"> "Android"> отметьте " Сохранять данные / кэш между развертываниями приложений".
Надеюсь, поможет!
Для приложений Xamarin Forms это то, что работает для меня:
- Установите SqlLite3 в проектах PCL, iOS и Android
- Установите Akavache в проектах PCL, iOS и Android
Переопределить OnStart
protected override void OnStart () {// Обрабатывать, когда ваше приложение запускает BlobCache.ApplicationName = "AppName"; BlobCache.EnsureInitialized(); }
Примените предложение выше от mainagioia (я хотел добавить голосование к предложению mainagioia, но, похоже, моя репутация слишком низкая... вот почему я добавляю этот бит). Сохранить данные приложения / кэш на устройстве между развертываниями в настройках