2014-01-10 5 views
1

Я последовал this guide на сайте Kinvey и теперь есть что-то это в моем MainActivity:Kinvey: Получить недавно сохраненные объекты из AppData во время автономной работы?

@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 не будет получать недавно сохраненные объекты в автономном режиме. У меня что-то не так, или такое кэширование невозможно?

ответ

1

Я инженер, работающий в библиотеке Android в Кинви и могу помочь вам с этим.

Это происходит из-за проблемы с синхронизацией, так как наша библиотека выполняет запросы асинхронно. Это означает, что после вызова сохранения сохранение не происходит немедленно, вместо этого создается поток, и запрос сохранения выполняется в фоновом режиме. Как только выполнение завершено, вы получите обратный вызов onSuccess (или onFailure, если что-то пойдет не так).

Итак, у вас есть несколько вариантов о том, как справиться с этим, и наиболее распространенным решением является просто ждать OnSuccess обратного вызова этого первого save--

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

    } 
    ... 
}); 

С выше фрагментом запрос сохранения будет выполнен, и как только это будет завершено, будет выполнен запрос get. Если у вас есть тонна встроенных вызовов, подобных этому, она может стать неуправляемой, поэтому наша библиотека также имеет синхронные (блокирующие) реализации всех методов - и вы можете написать свой собственный AsyncTask, который может объединить множество блокирующих реализаций.

Дайте мне знать, если это имеет смысл!

---------------------------------- После редактирования:

ОК, я вижу, что здесь проблема заключается в том, что запрос Get без запроса (получить все, что вы используете выше) по-прежнему является технически запросом, а в автономном режиме не поддерживается разрешение запросов на клиенте. Запрос может быть разрешен на сервере, а затем результаты сохраняются локально, поэтому, если запрос повторяется в автономном режиме, он возвращает только предыдущие результаты. Я также пытался объяснить это здесь:

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

НО

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

+0

Я обновил свой код. Пожалуйста, посмотрите мой выход в журнал. – Steffen

+0

Спасибо за ваш ответ. Я прочитал объяснение «Обновление локального хранилища», но думал, что запрос «получить все» не является технически запросом, и поэтому можно было бы получить все в локальном автономном хранилище. Поскольку эта функция была бы большой причиной для меня выбрать Kinvey над другими конкурентными сервисами MBaaS: знаете ли вы, сколько времени это может потребоваться до тех пор, пока поддержка «offline get all» не будет поддерживаться? – Steffen

+0

Было ли это когда-либо исправлено?Мы нуждаемся в поддержке создания сущностей в автономном режиме, но в документации все еще говорится, что она не будет возвращена. «Если добавлен объект 4, отвечающий критериям запроса, он не будет возвращен с запросом q до тех пор, пока соединение не будет восстановлено». – Dylan