Domanda

ho seguito Questa guida sul sito Web di Kinyvey e ora ha qualcosa inla mia mainattività:

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

Ora se il telefono è online e avvio l'app più volte che ottengo la seguente uscita:

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

Ma se attivo la modalità Airplane per simulare l'utilizzo offline:

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

Come puoi vedere l'AppData non riceverà le entità salvate di recente durante l'essere aperta.Ho qualcosa di sbagliato o questo tipo di caching non è possibile?

È stato utile?

Soluzione

Sono un ingegnere che lavora sulla libreria Android a Kinyvey e può aiutarti con questo.

Questo sta accadendo a causa di un problema di temporizzazione, poiché la nostra biblioteca sta eseguendo le richieste in modo asincrono. Ciò significa che dopo aver chiamato Salva, il salvataggio non si verifica immediatamente, invece un thread viene generato e la richiesta di salvataggio viene eseguita in background. Una volta completata l'esecuzione, otterrai la callback onsuccess (o l'onfailure, se qualcosa va storto).

Allora, hai un paio di opzioni su come gestire questo, e la soluzione più comune è quella di attendere semplicemente il callback onsuccess di quel primo salvataggio -

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

    }
    ... 
}); 
.

Con lo snippet sopra riportato, la richiesta di salvataggio verrà eseguita e una volta completata, verrà eseguito il GET. Se hai una tonnellata di chiamate incorporate come questa può diventare ingestibile, quindi la nostra biblioteca ha anche implementazioni sincrono (blocco) di tutti i metodi-- e puoi scrivere il proprio AsyncTask che può catenersi un sacco di implementazioni di blocco. Fammi sapere se questo ha senso!

------------------------------------ Dopo la modifica:

Ok, vedo cosa sta succedendo qui-- Il problema è che una richiesta di ricezione senza query (un ottieni tutto, ciò che stai usando sopra) è ancora tecnicamente una query e offline non ha il supporto per la risoluzione delle query il cliente. Una query può essere risolta sul server, quindi i risultati vengono salvati localmente, quindi se la query viene ripetuta mentre è offline, restituirà solo i risultati precedenti. Ho anche provato a spiegarlo qui:

http://devcenter.kinyy.com/android/guides/caching- Offline # AggiornamentoTheLocalStore

ma

A Ottieni tutte le richieste, mentre tecnicamente una query, può essere risolta sul client restituendo solo ogni riga immagazzinata offline. Quindi, ho aggiunto un nuovo biglietto per il backlog e aggiungerò supporto per questo in futuro! Grazie per la tua pazienza, e per aver sottolineato che questo può essere supportato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top