Frage

ich folgte diesen Leitfaden auf der Kinvey-Website und habe jetzt Folgendes in meiner MainActivity:

@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);
                }
            });
        }
    });
}

Wenn das Telefon nun online ist und ich die App mehrmals starte, erhalte ich die folgende Ausgabe:

V/TAG﹕ received 0 events
V/TAG﹕ received 1 events
V/TAG﹕ received 2 events
V/TAG﹕ received 3 events
...

Aber wenn ich den Flugzeugmodus aktiviere, um die Offline-Nutzung zu simulieren:

V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...

Wie Sie sehen, ruft AppData die zuletzt gespeicherten Entitäten nicht ab, während es offline ist.Verstehe ich etwas falsch oder ist diese Art der Zwischenspeicherung nicht möglich?

War es hilfreich?

Lösung

Ich bin Ingenieur und arbeite an der Android-Bibliothek bei Kinvey und kann Ihnen dabei helfen.

Dies geschieht aufgrund eines Zeitproblems, da unsere Bibliothek Anforderungen asynchron ausführt.Das bedeutet, dass nach dem Aufruf von save die Speicherung nicht sofort erfolgt, sondern stattdessen ein Thread erzeugt wird und die Speicheranforderung im Hintergrund ausgeführt wird.Sobald die Ausführung abgeschlossen ist, erhalten Sie den onSuccess-Rückruf (oder den onFailure, wenn etwas schief geht).

Sie haben also mehrere Möglichkeiten, damit umzugehen, und die häufigste Lösung besteht darin, einfach auf den onSuccess-Rückruf dieses ersten Speicherns zu warten.

myweights.save(weight, new KinveyClientCallback<WeightEntity>() { 
    public void onSuccess(WeightEntity result){
        myweights.get(new KinveyListCallback<WeightEntity>() { 
            ... 
        }); 

    }
    ... 
}); 

Mit dem obigen Snippet wird die Speicheranforderung ausgeführt, und sobald diese abgeschlossen ist, wird der Abruf ausgeführt.Wenn Sie eine Menge eingebetteter Aufrufe wie diesen haben, kann es unüberschaubar werden, daher verfügt unsere Bibliothek auch über synchrone (blockierende) Implementierungen aller Methoden – und Sie können Ihre eigenen schreiben AsyncTask Das kann viele blockierende Implementierungen miteinander verketten.

Lassen Sie mich wissen, ob das Sinn macht!

----------------------------------Nach der Bearbeitung:

OK, ich verstehe, was hier passiert – das Problem ist, dass eine Get-Anfrage ohne Abfrage (eine Get-All-Anfrage, die Sie oben verwenden) technisch gesehen immer noch eine Abfrage ist und offline keine Unterstützung für die Lösung von Abfragen auf dem Client bietet.Eine Abfrage kann auf dem Server gelöst werden und die Ergebnisse werden dann lokal gespeichert. Wenn die Abfrage also offline wiederholt wird, werden nur die vorherigen Ergebnisse zurückgegeben.Ich habe auch versucht, das hier zu erklären:

http://devcenter.kinvey.com/android/guides/caching-offline#Updatingthelocalstore

ABER

Eine Get-All-Anfrage ist zwar technisch gesehen eine Abfrage, kann aber auf dem Client gelöst werden, indem einfach jede Zeile zurückgegeben wird, die offline gespeichert ist.Deshalb habe ich dem Backlog ein neues Ticket hinzugefügt und werde dies in Zukunft unterstützen!Vielen Dank für Ihre Geduld und den Hinweis, dass dies unterstützt werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top