Pregunta

He seguido esta guía en el Kinvey sitio web y ahora tenemos algo de esto en mi 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);
                }
            });
        }
    });
}

Ahora bien, si el teléfono está en línea y hago iniciar la aplicación varias veces que me da el siguiente resultado:

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

Pero si puedo activar el modo avión para simular su uso sin conexión:

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

Como se puede ver la AppData no la ha guardado recientemente entidades, mientras están fuera de línea.Obtengo algo mal o es que este tipo de almacenamiento en caché no es posible?

¿Fue útil?

Solución

Soy un ingeniero que trabaja en el Androide biblioteca en Kinvey y puede ayudarle con esto.

Esto está sucediendo debido a un problema de temporización, como nuestra biblioteca es la ejecución de las solicitudes de forma asincrónica.Esto significa que después de llamar a guardar, guardar no se produce inmediatamente, en lugar de un hilo es generado y guardar la solicitud se ejecuta en segundo plano.Una vez que la ejecución se ha completado, usted recibirá la onSuccess de devolución de llamada (o el onFailure, si algo sale mal).

Así, usted tiene un par de opciones sobre cómo manejar esto, y la solución más común es simplemente esperar a que el onSuccess de devolución de llamada de la primera guardar--

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

    }
    ... 
}); 

Con el fragmento anterior, el guardar solicitud será ejecutado, y una vez que se complete el obtener va a ser ejecutado.Si usted tiene un montón de llamadas incrustadas como este puede volverse inmanejable, por lo que nuestra biblioteca también ha sincrónica (bloqueo) de las implementaciones de todos los métodos, y usted puede escribir su propio AsyncTask que puede encadenar un montón de bloqueo de las implementaciones.

Déjeme saber si eso tiene sentido!

----------------------------------Después de editar:

OK, veo lo que está sucediendo aquí, el problema es que una solicitud Get sin consulta (a obtener de todo, lo que usted está utilizando más arriba) es todavía técnicamente una consulta, y sin conexión no tiene el apoyo para la resolución de dudas en el cliente.Una consulta se puede resolver en el servidor y, a continuación, los resultados se guardan localmente, por lo que si la consulta se repite mientras que fuera de línea devolverá sólo los resultados anteriores.También traté de explicar esto aquí:

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

PERO

obtener todos los de la solicitud, si bien es técnicamente una consulta, puede ser resuelto en el cliente acaba de regresar a cada fila que se almacenan fuera de línea.Así que, he añadido un nuevo billete para el atraso, y añadirá soporte para esto en el futuro!Gracias por su paciencia, y por señalar que esto puede ser apoyado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top