Kinvey:Obter salvos recentemente entidades do AppData ao off-line?
Pergunta
Eu segui este guia no Kinvey site, e agora tem algo que esta em meu 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);
}
});
}
});
}
Agora, se o telefone está online e eu faço iniciar o aplicativo várias vezes para obter o seguinte resultado:
V/TAG﹕ received 0 events
V/TAG﹕ received 1 events
V/TAG﹕ received 2 events
V/TAG﹕ received 3 events
...
Mas se eu ativar o modo de avião para simular o uso off-line:
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...
Como você pode ver o AppData, não irá obter a salvo recentemente entidades, enquanto estando offline.Posso fazer algo errado ou é este tipo de colocação em cache não é possível?
Solução
Eu sou um engenheiro a trabalhar no Android biblioteca Kinvey e pode ajudá-lo com um presente.
Isso está acontecendo devido a um problema de tempo, como a nossa biblioteca é a execução de pedidos de forma assíncrona.Isso significa que, após chamada a salvar, salvar não ocorrer imediatamente, em vez de um segmento é gerado e o guarde pedido é executado no plano de fundo.Uma vez que a execução foi concluída, você receberá o onSuccess de retorno de chamada (ou o onFailure, se algo der errado).
Então, você tem algumas opções sobre como lidar com isso, e a solução mais comum é só esperar para a onSuccess de retorno de chamada do primeiro save--
myweights.save(weight, new KinveyClientCallback<WeightEntity>() {
public void onSuccess(WeightEntity result){
myweights.get(new KinveyListCallback<WeightEntity>() {
...
});
}
...
});
Com o trecho acima, a salvar a solicitação será executada, e uma vez que esteja completa, em seguida, o get será executado.Se você tem uma tonelada de chamadas incorporado como este, ele pode ficar incontrolável, por isso a nossa biblioteca também tem síncrona (bloqueio) implementações de todos os métodos-e você pode escrever o seu próprio AsyncTask
que pode encadear uma série de bloqueio de implementações.
Deixe-me saber se isso faz sentido!
----------------------------------Depois da edição:
OK, eu sei o que está acontecendo aqui-- o problema é que uma solicitação Get, sem consulta (um get todos, o que você está usando acima) ainda é, tecnicamente, uma consulta, e off-line não tem suporte para a resolução de consultas no cliente.Uma consulta pode ser resolvida no servidor e, em seguida, os resultados são guardados localmente, por isso, se a consulta é repetido enquanto off-line, ele só vai retornar aos resultados anteriores.Também tentei explicar isso aqui:
http://devcenter.kinvey.com/android/guides/caching-offline#Updatingthelocalstore
MAS
um obter todas pedido, embora tecnicamente uma consulta, pode ser resolvido com o cliente por apenas retornando a cada linha que é armazenados off-line.Assim, eu adicionei um novo bilhete para a lista de pendências, e vai adicionar suporte para isso no futuro!Obrigado pela sua paciência, e a indicação de que este pode ser suportada.