共有 PCL ライブラリを使用する Xamarin Android プロジェクトがあり、Akavache を一時データ ストアとして使用することにしました (単純なログイン状態情報を保存し、毎回再ログインを保存するため)。
そこで、Akavache および Akavache.Sqlite3 nuget パッケージを共有ライブラリ (および Xamarin.Android プロジェクト) に追加しました。を設定しBlobCache.ApplicationName
、呼び出しさえEnsureInitialized
しました(メッセージをログに記録する以上のことはしていないようです)。
アプリをデバイスにデプロイしました。手動で起動しました(データや設定などの消去はありません)。アプリが実行されている限り、データはキャッシュ (および取得) されます。キーが欠落している場合、(予想どおり) 例外がスローされます。すべてが完璧に機能します。
次に、アプリをシャットダウンしました(ある段階では、電話を再起動しました)。再起動すると、キャッシュが空になるか、再初期化されます。いずれにせよ、キャッシュしたものはすべてなくなりました。
キャッシュ sqlite3 ファイルが保存されている場所をデバッガーで調べたところ、アプリは明らかにdata/data/packagename/cache/xyzblobs.db
. これらのファイルは内部のシステム キャッシュ/アプリ ファイル ディレクトリにあるため、表示できません。したがって、ワイプされているかどうかはわかりません。
WRITE_EXTERNAL_STORAGE (および READ_) 権限を有効にしました。サイコロはありません。Secure
、UserAccount
およびLocalMachine
ターゲットを使用してみました。なだ。それらのどれも機能しません。
アプリが実行されている (またはメモリ内にある) 限り、期待どおりに動作します。アプリがなくなる瞬間、キャッシュも消えます。
私が行っていない唯一のことは、メソッドを呼び出すことBlobStorage.Shutdown()
です。そして、それは私がそれをどこに呼ぶべきかわからないからです。私は複数のアクティビティを持っていますが、愚かなので参照カウントをしたくありません。
編集:後で強制的に電話をかけましたが.Shutdown().Wait()
、それも役に立たなかったようです。
他の誰かがこれを経験しましたか?まったく同じ問題を抱えている他の人を少なくとも 1 人知っています。詳細については、こちらのXamarin フォーラムを参照してください。
Xamarin 以外の Android の他の場所で以前に使用したことがあるので、すべての Akavache を引き出す必要は本当にありません。それは素晴らしいことです。それ以外の場合は、ある種の xplat 共有設定マネージャーを調べ始める必要があります。
編集:コードの一部を次に示します。
初期化(シングルトンタイプのものを保持するために使用する静的な共有「AppGlobal」クラスがあります)
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をインストールしても発生します。おそらく、これらのdbファイルが本来の場所にないことに関係していると思いますが、完全に途方に暮れています。
プラットフォーム固有のレベルで何かを実装し、それを共有ライブラリに渡す必要がありますか? すべての依存関係とパスが解決されているように見えるので、そうは思いません。
私はこれで何時間も無駄にしました。
ありがとう :)