Кинви:Получить недавно сохраненные объекты из AppData в автономном режиме?
Вопрос
Я последовал за это руководство на веб-сайте Kinvey, и теперь в моей основной активности есть что-то такое:
@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);
}
});
}
});
}
Теперь, если телефон подключен к сети и я запускаю приложение несколько раз, я получаю следующий результат:
V/TAG﹕ received 0 events
V/TAG﹕ received 1 events
V/TAG﹕ received 2 events
V/TAG﹕ received 3 events
...
Но если я активирую режим полета, чтобы имитировать использование в автономном режиме:
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...
Как вы можете видеть, AppData не получит недавно сохраненные объекты, находясь в автономном режиме.Я что-то не так понимаю или такое кэширование невозможно?
Решение
Я инженер, работающий над библиотекой Android в Kinvey, и могу помочь вам с этим.
Это происходит из-за проблемы с синхронизацией, поскольку наша библиотека выполняет запросы асинхронно.Это означает, что после вызова save сохранение не происходит сразу, вместо этого создается поток, и запрос на сохранение выполняется в фоновом режиме.После завершения выполнения вы получите обратный вызов onSuccess (или onFailure, если что-то пойдет не так).
Итак, у вас есть несколько вариантов, как справиться с этим, и наиболее распространенное решение — просто дождаться обратного вызова onSuccess для этого первого сохранения —
myweights.save(weight, new KinveyClientCallback<WeightEntity>() {
public void onSuccess(WeightEntity result){
myweights.get(new KinveyListCallback<WeightEntity>() {
...
});
}
...
});
С помощью приведенного выше фрагмента будет выполнен запрос на сохранение, и как только он будет завершен, будет выполнен запрос на получение.Если у вас тонна встроенных вызовов, подобных этому, они могут стать неуправляемыми, поэтому в нашей библиотеке также есть синхронные (блокирующие) реализации всех методов — и вы можете написать свои собственные AsyncTask
это может объединить множество реализаций блокировки.
Дайте мне знать, если это имеет смысл!
----------------------------------После редактирования:
Хорошо, я понимаю, что здесь происходит - проблема в том, что запрос Get без запроса (получить все, что вы используете выше) по-прежнему технически является запросом, а в автономном режиме нет поддержки для разрешения запросов на клиенте.Запрос может быть решен на сервере, а затем результаты сохраняются локально, поэтому, если запрос повторяется в автономном режиме, он вернет только предыдущие результаты.Я также пытался объяснить это здесь:
http://devcenter.kinvey.com/android/guides/caching-offline#Updatingthelocalstore
НО
запрос на получение всех данных, хотя технически это и есть запрос, может быть решен на клиенте путем простого возврата каждой строки, хранящейся в автономном режиме.Итак, я добавил новый тикет в список и добавлю его поддержку в будущем!Спасибо за ваше терпение и за указание на то, что это можно поддержать.