Question

J'ai suivi ce guide sur le Kinvey site web et ils ont maintenant quelque chose de cela dans mon 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);
                }
            });
        }
    });
}

Maintenant, si le téléphone est en ligne et je ne démarrez l'application plusieurs fois, j'obtiens le résultat suivant:

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

Mais si j'active le mode avion pour simuler l'utilisation hors connexion:

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

Comme vous pouvez le voir le AppData n'obtiendrez pas le récemment enregistré des entités tout en étant hors connexion.Puis-je obtenir quelque chose de mal ou est ce genre de mise en cache pas possible?

Était-ce utile?

La solution

Je suis un ingénieur travaillant sur l'Android bibliothèque Kinvey et peut vous aider avec celui-ci.

Ce qui se passe à cause d'un problème de synchronisation, comme notre bibliothèque est l'exécution de demandes de façon asynchrone.Cela signifie qu'après l'appel de l'enregistrer, l'enregistrement ne se produit pas immédiatement, au lieu d'un thread est généré et l'enregistrer la demande est exécutée en arrière-plan.Une fois l'exécution terminée, vous obtiendrez la onSuccess de rappel (ou le onFailure, si quelque chose se passe mal).

Donc, vous avez quelques options sur la façon de gérer cela, et la solution la plus courante consiste à attendre pour le onSuccess rappel de ce premier enregistrer--

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

    }
    ... 
}); 

Avec l'extrait ci-dessus, le enregistrer la demande sera exécutée, et une fois que c'est terminé, puis l'obtenir sera exécuté.Si vous avez une tonne d'appels imbriqués comme cela, il peut obtenir ingérable, donc notre bibliothèque a également synchrone (blocage) mises en œuvre de toutes les méthodes, et vous pouvez écrire votre propre AsyncTask qui peut enchaîner beaucoup de blocage mises en œuvre.

Laissez-moi savoir si cela a du sens!

----------------------------------Après la modification:

OK, je vois ce qui se passe ici-- la question est que une requête Get avec pas de requête (get tous, ce que vous utilisez ci-dessus) est toujours techniquement une requête, et en mode hors connexion n'a pas de prise en charge pour résoudre les requêtes sur le client.Une requête peut être résolu sur le serveur, puis les résultats sont enregistrés localement, donc, si la requête est répétée en mode hors connexion il retournera seulement les résultats précédents.J'ai aussi essayé d'expliquer cela ici:

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

MAIS

un obtenir toutes les demandes, même si, techniquement, une requête, peut être résolu sur le client par tout simplement rentrer chaque ligne est stockée hors ligne.Donc, j'ai ajouté un nouveau billet pour le carnet de commandes, et va ajouter le support pour cela dans le futur!Merci pour votre patience, et pour souligner que cela peut être pris en charge.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top