gpt4 book ai didi

java - Kinvey:离线时从 AppData 获取最近保存的实体?

转载 作者:行者123 更新时间:2023-11-30 03:10:36 25 4
gpt4 key购买 nike

我关注了this guide在 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 库的一名工程师,可以帮助您解决这个问题。

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

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

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

}
...
});

使用上面的代码 fragment ,将执行保存请求,一旦完成,将执行获取。如果你有大量这样的嵌入式调用,它会变得难以管理,所以我们的库也有所有方法的同步(阻塞)实现——你可以编写你自己的 AsyncTask ,它可以将很多链接在一起阻止实现。

让我知道这是否有意义!

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

好的,我明白这里发生了什么——问题是没有查询的 Get 请求(获取所有,你在上面使用的)在技术上仍然是一个查询,离线不支持解析查询客户端。一个查询可以在服务器上解析,然后将结果保存在本地,所以如果在离线状态下重复查询,它只会返回以前的结果。我也试着在这里解释一下:

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

但是

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

关于java - Kinvey:离线时从 AppData 获取最近保存的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com