Kinvey:オフラインでAppDataから最近保存されたエンティティを入手しましょうか。

StackOverflow https://stackoverflow.com//questions/21050841

質問

私はこのガイドこのガイド 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を取得しながら、テクノロンのクエリをクライアントで解決することができます。だから、私はバックログに新しいチケットを追加し、将来これのサポートを追加します!あなたの忍耐力をありがとう、そしてこれがサポートできることを指摘しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top