4

共有 PCL ライブラリを使用する Xamarin Android プロジェクトがあり、Akavache を一時データ ストアとして使用することにしました (単純なログイン状態情報を保存し、毎回再ログインを保存するため)。

そこで、Akavache および Akavache.Sqlite3 nuget パッケージを共有ライブラリ (および Xamarin.Android プロジェクト) に追加しました。を設定しBlobCache.ApplicationName、呼び出しさえEnsureInitializedしました(メッセージをログに記録する以上のことはしていないようです)。

アプリをデバイスにデプロイしました。手動で起動しました(データや設定などの消去はありません)。アプリが実行されている限り、データはキャッシュ (および取得) されます。キーが欠落している場合、(予想どおり) 例外がスローされます。すべてが完璧に機能します。

次に、アプリをシャットダウンしました(ある段階では、電話を再起動しました)。再起動すると、キャッシュが空になるか、再初期化されます。いずれにせよ、キャッシュしたものはすべてなくなりました。

キャッシュ sqlite3 ファイルが保存されている場所をデバッガーで調べたところ、アプリは明らかにdata/data/packagename/cache/xyzblobs.db. これらのファイルは内部のシステム キャッシュ/アプリ ファイル ディレクトリにあるため、表示できません。したがって、ワイプされているかどうかはわかりません。

WRITE_EXTERNAL_STORAGE (および READ_) 権限を有効にしました。サイコロはありません。SecureUserAccountおよび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ファイルが本来の場所にないことに関係していると思いますが、完全に途方に暮れています。

プラットフォーム固有のレベルで何かを実装し、それを共有ライブラリに渡す必要がありますか? すべての依存関係とパスが解決されているように見えるので、そうは思いません。

私はこれで何時間も無駄にしました。

ありがとう :)

4

3 に答える 3

4

私は同じ問題を抱えていたので、設定でデプロイ間でデバイス上のアプリケーションデータ/キャッシュを保存することをチェックして解決しました。

Visual Studio の場合:

  • [ツール] > [オプション] > (左側のツリー) [Xamarin] > [Android の設定] > [デプロイ間でデバイスのアプリケーション データ/キャッシュを保持する] チェック ボックスをオンにします。

Xamarin スタジオで:

  • (Windows) [ツール] > [オプション] > [プロジェクト] > [Android] > [アプリケーションのデプロイ間でデータ/キャッシュを保持する] をオンにします。

また

  • (OS X) Xamarin Studio > Preferences > Projects > Android > Preserve data/cache between application deploy をチェックします。

それが役に立てば幸い!

于 2015-12-10T14:35:40.647 に答える
0

Xamarin Forms アプリの場合、これがうまくいきました。

  1. PCL、iOS、および Android プロジェクトに SqlLite3 をインストールする
  2. PCL、iOS、および Android プロジェクトに Akavache をインストールする
  3. OnStart をオーバーライドする

    protected override void OnStart() { // アプリの起動時の処理 BlobCache.ApplicationName = "AppName"; BlobCache.EnsureInitialized(); }

上記の mainagioia からの提案を適用します (mainagioia の提案に投票を追加したかったのですが、評判が低すぎるようです... そのため、このビットを追加しています)。 設定でデプロイ間でデバイス上のアプリケーション データ/キャッシュを保持する

于 2017-01-10T20:36:44.270 に答える