如何设置Kinvey以在Android中保持数据库脱机

时间:2014-01-20 23:11:49

标签: kinvey

我创建了一个包含多个数据库的应用程序,我需要使用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)

1 个答案:

答案 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();
        }

        });

    }
});

此外,请勿调用注销,因为脱机同步服务需要活动用户上下文才能进行同步。出于安全考虑,我们在执行注销时清除队列和脱机存储。