1

我在 Kinvey 网站上遵循了这个指南 ,现在在我的 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);
                }
            });
        }
    });
}

现在,如果手机在线并且我确实启动了几次应用程序,我会得到以下输出:

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 在离线时不会获取最近保存的实体。我是不是搞错了,或者这种缓存是不可能的?

4

1 回答 1

1

我是一名工程师,在 Kinvey 开发 Android 库,可以帮助您解决这个问题。

这是由于时间问题而发生的,因为我们的库正在异步执行请求。这意味着在您调用 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

获取所有请求,虽然从技术上讲是一个查询,但可以通过返回离线存储的每一行在客户端上解决。所以,我在 backlog 中添加了一张新票,并将在未来添加对此的支持!感谢您的耐心等待,并指出这可以得到支持。

于 2014-01-10T19:28:44.187 回答