Kinvey:オフラインでAppDataから最近保存されたエンティティを入手しましょうか。
質問
私はこのガイドこのガイド Kinveyのウェブサイトでは、これで何かがあります。私の主な悪影症:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Client mKinveyClient = new Client.Builder(this.getApplicationContext()).build();
final AsyncAppData<MyEntity> ad = mKinveyClient.appData("myCollection", MyEntity.class);
ad.setCache(new InMemoryLRUCache(), CachePolicy.CACHEFIRST);
ad.setOffline(OfflinePolicy.LOCAL_FIRST, new SqlLiteOfflineStore<MyEntity>(this));
MyEntity event = new MyEntity();
event.setName("Launch Party");
event.setAddress("Kinvey HQ");
ad.save(event, new KinveyClientCallback<MyEntity>() {
@Override
public void onFailure(Throwable e) {
Log.e("TAG", "failed to save event data", e);
}
@Override
public void onSuccess(MyEntity r) {
Log.d("TAG", "saved data for entity "+ r.getName());
ad.get(new KinveyListCallback<MyEntity>() {
@Override
public void onSuccess(MyEntity[] result) {
Log.v("TAG", "received "+ result.length + " events");
}
@Override
public void onFailure(Throwable error) {
Log.e("TAG", "failed to fetch all", error);
}
});
}
});
}
.
電話がオンラインで、私はアプリを数回起動します次の出力を取得します。
V/TAG﹕ received 0 events
V/TAG﹕ received 1 events
V/TAG﹕ received 2 events
V/TAG﹕ received 3 events
...
.
しかし、私がオフラインの使用法をシミュレートするために飛行機モードを有効にすると:
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...
.
あなたが見ることができるように、AppDataは最近保存されたエンティティを撮っている間は、オフラインではありません。私は何か問題がないか、この種のキャッシングはできませんか?
解決
私はKinveyのAndroidライブラリに取り組んでいて、これであなたを助けることができます。
私たちのライブラリが非同期的に要求を実行しているので、タイミングの問題のために起こります。つまり、保存を呼び出した後、保存はすぐに行われませんが、代わりにスレッドが生成され、保存要求がバックグラウンドで実行されます。実行が完了したら、OnSuccessコールバック(または何かがうまくいかない場合はonfailure)を取得します。
だから、これを処理する方法についてはいくつかのオプションがあり、最も一般的な解決策は、その最初の保存のOnSuccessコールバックを待つことです -
myweights.save(weight, new KinveyClientCallback<WeightEntity>() {
public void onSuccess(WeightEntity result){
myweights.get(new KinveyListCallback<WeightEntity>() {
...
});
}
...
});
.
上記のスニペットでは、保存要求が実行され、完了したらGETが実行されます。このような組み込み電話をかけている場合は、管理不能になる可能性があるため、ライブラリもすべてのメソッドの同期(ブロック)実装を持ちます。これにより、ブロッキング実装の多くを組み合わせることができる独自のAsyncTask
を作成できます。
それが理にかなっているかどうかを私に知らせてください!
------------------------------------編集後:
OK、私はここで何が起こっているのかを見ます - 問題は、クエリのない要求(ALLを取得しているもの)がまだ技術的に照会であり、オフラインでクエリを解決するためのサポートがありません。クライアント。クエリはサーバー上で解決でき、結果はローカルに保存されるため、オフラインでクエリが繰り返されると、前の結果は返されます。私はまたここでこれを説明しようとしました:
http://deventer.kinvey.com/android/guides/caching-オフライン#updatingthelocalstore
しかし
A ALL Requestを取得しながら、テクノロンのクエリをクライアントで解決することができます。だから、私はバックログに新しいチケットを追加し、将来これのサポートを追加します!あなたの忍耐力をありがとう、そしてこれがサポートできることを指摘しています。