金维:离线时从 AppData 获取最近保存的实体?
题
我跟着 本指南 在 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
但
获取所有请求虽然从技术上讲是一个查询,但可以通过仅返回脱机存储的每一行来在客户端上解决。因此,我在待办事项中添加了一张新票,并将在将来添加对此的支持!感谢您的耐心等待,并指出这是可以支持的。