如何在Android中设置Kinvey以维护数据库



我已经创建了一个包含多个数据库的应用程序,我需要使用Kinvey来维护此数据。目前,我正在使用SQLite在本地存储所有数据。我可以编写代码以同步自己,但是要让Kinvey这样做会更好。当我不尝试使用缓存和离线时,数据将正确写入Kinvey数据库...我可以通过Web控制台对此进行验证。当我尝试添加用于缓存和离线策略的两行代码时,没有写给Kinvey DB,我会收到与下面显示的相似的错误。这只是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":"启动派对"," ID":" 5E8684EE321664FA79797F4D1CF4D1CF53F55082" F53F55082 _user = null01-20 15:42:15.257:e/sqlitedatabase(6992):android.database.sqlite.sqliteconstraintexception:offlinemyCollection._user可能不会为NULL(代码19)

我是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();
        }
        });
    }
});

另外,请不要召集注销,因为离线同步服务需要活动的用户上下文才能同步。出于安全目的,我们在执行注销时清除队列和离线商店。