我创建了一个包含多个数据库的应用程序,我需要使用Kinvey来维护这些数据。目前,我正在使用sqlite在本地存储所有数据。我可以编写代码来自我同步,但让Kinvey这样做会好得多。当我不尝试使用Cache和Offline时,数据被正确写入Kinvey数据库......我可以通过Web控制台验证这一点。当我尝试为缓存和脱机策略添加两行代码时,没有任何内容写入Kinvey数据库,我得到类似于下面显示的错误。这只是logcat错误的一部分。离线用户登录似乎有些问题?我在下面添加了一些简单的代码来重现我遇到的问题。我已多次阅读网站上的指南,而我似乎只是在忽略某些东西。我在指南中添加了显示的服务和权限。我不知道还有什么可以尝试或去哪儿。关于我做错了什么的任何想法?感谢。
AsyncAppData gear = kinveyClient.appData("myCollection",
MyEntity.class);
gear.setCache(new InMemoryLRUCache(), CachePolicy.CACHEFIRST);
gear.setOffline(OfflinePolicy.LOCAL_FIRST, new SqlLiteOfflineStore(this));
kinveyClient.user().login(username, password, new KinveyUserCallback() {
@Override
public void onFailure(Throwable arg0) {
}
@Override
public void onSuccess(User arg0) {
}
});
MyEntity event = new MyEntity();
event.setTitle("Launch Party");
gear.save(event, new KinveyClientCallback() {
@Override
public void onFailure(Throwable arg0) {
}
@Override
public void onSuccess(MyEntity arg0) {
Toast.makeText(getApplicationContext(),
"Object saved is: " + arg0.getTitle(),
Toast.LENGTH_LONG).show();
}
});
kinveyClient.user().logout().execute();
这是LogCat错误的一部分:
01-20 15:42:15.257:E / SQLiteDatabase(6992):插入json = {“Title”时出错:“Launch Party”,“id”:“5e8684e321664fa797f4d1cf53f55082”} deleted = 0 _id = 5e8684e321664fa797f4d1cf53f55082 _user = null 01-20 15:42:15.257:E / SQLiteDatabase(6992):android.database.sqlite.SQLiteConstraintException:offlinemyCollection._user可能不为NULL(代码19)
答案 0 :(得分:0)
我是Kinvey的工程师,正在研究android库,可以帮助你解决这个问题 -
问题是我们的库是异步执行操作的,因此您需要等到登录请求在后台完成后再尝试执行该保存:
AsyncAppData gear = kinveyClient.appData("myCollection",
MyEntity.class);
gear.setCache(new InMemoryLRUCache(), CachePolicy.CACHEFIRST);
gear.setOffline(OfflinePolicy.LOCAL_FIRST, new SqlLiteOfflineStore(this));
kinveyClient.user().login(username, password, new KinveyUserCallback() {
@Override
public void onFailure(Throwable arg0) {
}
@Override
public void onSuccess(User arg0) {
MyEntity event = new MyEntity();
event.setTitle("Launch Party");
gear.save(event, new KinveyClientCallback() {
@Override
public void onFailure(Throwable arg0) {}
@Override
public void onSuccess(MyEntity arg0) {
Toast.makeText(getApplicationContext(),
"Object saved is: " + arg0.getTitle(),
Toast.LENGTH_LONG).show();
}
});
}
});
此外,请勿调用注销,因为脱机同步服务需要活动用户上下文才能进行同步。出于安全考虑,我们在执行注销时清除队列和脱机存储。