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 это то, что работает для меня:

  1. Установите SqlLite3 в проектах PCL, iOS и Android
  2. Установите Akavache в проектах PCL, iOS и Android
  3. Переопределить OnStart

    protected override void OnStart () {// Обрабатывать, когда ваше приложение запускает BlobCache.ApplicationName = "AppName"; BlobCache.EnsureInitialized(); }

Примените предложение выше от mainagioia (я хотел добавить голосование к предложению mainagioia, но, похоже, моя репутация слишком низкая... вот почему я добавляю этот бит). Сохранить данные приложения / кэш на устройстве между развертываниями в настройках

Другие вопросы по тегам