Кинви:Получить недавно сохраненные объекты из AppData в автономном режиме?

StackOverflow https://stackoverflow.com//questions/21050841

Вопрос

Я последовал за это руководство на веб-сайте 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

НО

запрос на получение всех данных, хотя технически это и есть запрос, может быть решен на клиенте путем простого возврата каждой строки, хранящейся в автономном режиме.Итак, я добавил новый тикет в список и добавлю его поддержку в будущем!Спасибо за ваше терпение и за указание на то, что это можно поддержать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top