Java Kinvey:脱机时从AppData获取最近保存的实体?

Java Kinvey:脱机时从AppData获取最近保存的实体?,java,android,caching,backend,kinvey,Java,Android,Caching,Backend,Kinvey,我关注了Kinvey的网站,现在我的主要活动是: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Client mKinveyClient = new Client.Builder(this.getApplicationContex

我关注了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 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...

正如您所见,AppData在脱机时不会获取最近保存的实体。我是不是有什么地方出错了,或者这种缓存是不可能的?

我是Kinvey Android库的工程师,可以帮你解决这个问题

发生这种情况是因为时间问题,因为我们的库正在异步执行请求。这意味着在调用save之后,保存不会立即发生,而是生成一个线程,并在后台执行save请求。一旦执行完成,您将得到onSuccess回调(或者onFailure,如果出现问题)

因此,关于如何处理这个问题,您有几个选项,最常见的解决方案是等待第一次保存的onSuccess回调--

myweights.save(权重,新的KinveyClientCallback(){
成功时公共作废(权重实体结果){
myweights.get(新的KinveyListCallback(){
... 
}); 
}
... 
}); 
使用上面的代码段,将执行save请求,完成后,将执行get。如果您有大量这样的嵌入式调用,它可能会变得不可管理,因此我们的库也有所有方法的同步(阻塞)实现——您可以编写自己的
AsyncTask
,将许多阻塞实现链接在一起

让我知道这是否有意义

----------------------------------编辑后:

好的,我看到这里发生了什么——问题是没有查询的Get请求(Get all,您在上面使用的)在技术上仍然是一个查询,脱机不支持在客户机上解析查询。可以在服务器上解析查询,然后将结果保存在本地,因此如果在脱机时重复查询,则只会返回以前的结果。我还试图在这里解释这一点:

但是


get all请求虽然在技术上是一个查询,但只需返回脱机存储的每一行,就可以在客户端上解决。因此,我已经在待办事项列表中添加了一个新的记录单,并将在将来添加对此的支持!感谢您的耐心,并指出这是可以支持的。

感谢您的回答。我已经阅读了关于“更新本地存储”的解释,但认为“获取全部”请求在技术上不是查询,因此可以在本地脱机存储上执行“获取全部”。由于此功能将是我选择Kinvey而非其他竞争性MBA服务的一个重要原因:您知道支持“离线获取全部”可能需要多长时间吗?这是否已修复?我们需要离线创建实体的支持,但文档中仍然表示不会返回。如果添加了符合查询条件的实体4,则在恢复连接之前,它不会与查询q一起返回
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
V/TAG﹕ received 3 events
...
myweights.save(weight, new KinveyClientCallback<WeightEntity>() { 
    public void onSuccess(WeightEntity result){
        myweights.get(new KinveyListCallback<WeightEntity>() { 
            ... 
        }); 

    }
    ... 
});