0

我创建了一个包含多个数据库的应用程序,我需要使用 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":"Launch Party","id":"5e8684e321664fa797f4d1cf53f55082"} 删除=0 _id=5e8684e321664fa797f4d1cf53f55082=0user 15:42:15.257:E/SQLiteDatabase(6992):android.database.sqlite.SQLiteConstraintException:offlinemyCollection._user 不能为 NULL(代码 19)

4

1 回答 1

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

        });

    }
});

另外,不要调用注销,因为离线同步服务需要一个活动的用户上下文才能进行同步。出于安全目的,我们在执行注销时清除队列和离线存储。

于 2014-01-30T18:49:15.623 回答