我跟着 本指南 在 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 在离线时不会获取最近保存的实体。我是否弄错了什么或者这种缓存不可能?

有帮助吗?

解决方案

我是一名在 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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top