如何将 Couchbase-Lite Android 与 CouchDB 同步?
How do I sync Couchbase-Lite Android with CouchDB?
问题:在推送过程中,我收到 "Bad Request" 错误和某种身份验证错误,尽管它得到了肯定的响应。
我几乎没有使用 CouchDB 或 Couchbase 的经验,但据我了解,您通常会将 Couchbase-Lite 与 Couchbase Sync Gateway 同步,但由于后者使用 CouchDB 的复制协议,只要您仍然可以使用 CouchDB不要使用 "Channels"。提到了使用 CouchDB 进行复制 here。我不想使用 Couchbase Sync 和 Couchbase Server,因为目前这是一个小的实验项目,我不需要频道,而且我的服务器没有足够的资源。
我正在使用 CBL-Android 0.0.0-501(我认为现在是最新的,已经尝试过 1.0.3)和 CouchDB 1.5.0。
这是在 Android 上我的主要 activity 的 onCreate 方法中调用的:
void minimalPushTest() throws IOException, CouchbaseLiteException {
String databaseName = "cblpushtest";
String couchDbUrl = "http://192.168.4.11:5984";
String userName = "testuser";
String userPw = "testpw";
// initialize database
Manager manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS);
Database database = manager.getDatabase(databaseName);
Document document = database.createDocument();
Map<String, Object> data = new HashMap<String, Object>();
data.put("somekey", "sometext");
document.putProperties(data);
// start push replication
Replication replication = database.createPushReplication(new URL(couchDbUrl));
replication.setContinuous(false);
replication.setAuthenticator(new BasicAuthenticator(userName, userPw));
replication.start();
}
这就是 CouchDB 对用户 "testuser" 的“/_session”的说法:
{"ok":true,"name":"testuser","roles":["testing"]}
...对于“/cblpushtest/_security”:
{"admins":{"names":[],"roles":[]},"members":{"names":["testuser"],"roles":["testing"]}}
这是 Android Studio 中的 logcat 输出:
03-15 23:15:14.999 27429-27429/ W/Sync﹕ [fireTrigger()] => START
03-15 23:15:15.109 27429-27429/ W/Sync﹕ [fireTrigger()] => GO_ONLINE
03-15 23:15:15.199 27429-27546/ E/Sync﹕ com.couchbase.lite.replicator.ReplicationInternal@429cbb20 checkSessionAtPath() response: {ok=true, userCtx={name=testuser, roles=[testing]}, info={authentication_db=_users, authentication_handlers=[oauth, cookie, default], authenticated=default}}
03-15 23:15:15.309 27429-27546/ W/Sync﹕ com.couchbase.lite.replicator.ReplicationInternal@4291cab0: error getting remote checkpoint
03-15 23:15:15.309 27429-27546/ E/Sync﹕ com.couchbase.lite.replicator.PusherInternal@429c1758: Progress: set error = org.apache.http.client.HttpResponseException: Bad Request
03-15 23:15:15.309 27429-27546/ W/Sync﹕ [fireTrigger()] => STOP_GRACEFUL
03-15 23:15:15.314 27429-27562/ W/Sync﹕ [fireTrigger()] => WAITING_FOR_CHANGES
03-15 23:15:15.314 27429-27562/ W/Sync﹕ [fireTrigger()] => STOP_IMMEDIATE
不知何故,"ok=true" 响应显示为错误。
这是couch.log(时钟似乎不同步,但这些是相关输出):
[Sun, 15 Mar 2015 22:14:32 GMT] [info] [<0.29026.2>] 192.168.4.61 - - GET /_session 200
[Sun, 15 Mar 2015 22:14:32 GMT] [info] [<0.29024.2>] 192.168.4.61 - - GET /_local/3e7d908842481392245906438560f235e9d3138f 400
明白了:数据库 url 需要指向实际的数据库,而不仅仅是指向 CouchDB 根目录。我以为我早些时候已经测试过了,但我想当时我仍然有身份验证问题,所以我过早地放弃了那个解决方案。
因此,couchDbUrl 的正确行是
String couchDbUrl = "http://192.168.4.11:5984/"+databaseName;
..它甚至可能不需要具有相同的名称,但我没有检查。不管怎样,数据现在被推送了。
问题:在推送过程中,我收到 "Bad Request" 错误和某种身份验证错误,尽管它得到了肯定的响应。
我几乎没有使用 CouchDB 或 Couchbase 的经验,但据我了解,您通常会将 Couchbase-Lite 与 Couchbase Sync Gateway 同步,但由于后者使用 CouchDB 的复制协议,只要您仍然可以使用 CouchDB不要使用 "Channels"。提到了使用 CouchDB 进行复制 here。我不想使用 Couchbase Sync 和 Couchbase Server,因为目前这是一个小的实验项目,我不需要频道,而且我的服务器没有足够的资源。
我正在使用 CBL-Android 0.0.0-501(我认为现在是最新的,已经尝试过 1.0.3)和 CouchDB 1.5.0。
这是在 Android 上我的主要 activity 的 onCreate 方法中调用的:
void minimalPushTest() throws IOException, CouchbaseLiteException {
String databaseName = "cblpushtest";
String couchDbUrl = "http://192.168.4.11:5984";
String userName = "testuser";
String userPw = "testpw";
// initialize database
Manager manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS);
Database database = manager.getDatabase(databaseName);
Document document = database.createDocument();
Map<String, Object> data = new HashMap<String, Object>();
data.put("somekey", "sometext");
document.putProperties(data);
// start push replication
Replication replication = database.createPushReplication(new URL(couchDbUrl));
replication.setContinuous(false);
replication.setAuthenticator(new BasicAuthenticator(userName, userPw));
replication.start();
}
这就是 CouchDB 对用户 "testuser" 的“/_session”的说法:
{"ok":true,"name":"testuser","roles":["testing"]}
...对于“/cblpushtest/_security”:
{"admins":{"names":[],"roles":[]},"members":{"names":["testuser"],"roles":["testing"]}}
这是 Android Studio 中的 logcat 输出:
03-15 23:15:14.999 27429-27429/ W/Sync﹕ [fireTrigger()] => START
03-15 23:15:15.109 27429-27429/ W/Sync﹕ [fireTrigger()] => GO_ONLINE
03-15 23:15:15.199 27429-27546/ E/Sync﹕ com.couchbase.lite.replicator.ReplicationInternal@429cbb20 checkSessionAtPath() response: {ok=true, userCtx={name=testuser, roles=[testing]}, info={authentication_db=_users, authentication_handlers=[oauth, cookie, default], authenticated=default}}
03-15 23:15:15.309 27429-27546/ W/Sync﹕ com.couchbase.lite.replicator.ReplicationInternal@4291cab0: error getting remote checkpoint
03-15 23:15:15.309 27429-27546/ E/Sync﹕ com.couchbase.lite.replicator.PusherInternal@429c1758: Progress: set error = org.apache.http.client.HttpResponseException: Bad Request
03-15 23:15:15.309 27429-27546/ W/Sync﹕ [fireTrigger()] => STOP_GRACEFUL
03-15 23:15:15.314 27429-27562/ W/Sync﹕ [fireTrigger()] => WAITING_FOR_CHANGES
03-15 23:15:15.314 27429-27562/ W/Sync﹕ [fireTrigger()] => STOP_IMMEDIATE
不知何故,"ok=true" 响应显示为错误。
这是couch.log(时钟似乎不同步,但这些是相关输出):
[Sun, 15 Mar 2015 22:14:32 GMT] [info] [<0.29026.2>] 192.168.4.61 - - GET /_session 200
[Sun, 15 Mar 2015 22:14:32 GMT] [info] [<0.29024.2>] 192.168.4.61 - - GET /_local/3e7d908842481392245906438560f235e9d3138f 400
明白了:数据库 url 需要指向实际的数据库,而不仅仅是指向 CouchDB 根目录。我以为我早些时候已经测试过了,但我想当时我仍然有身份验证问题,所以我过早地放弃了那个解决方案。
因此,couchDbUrl 的正确行是
String couchDbUrl = "http://192.168.4.11:5984/"+databaseName;
..它甚至可能不需要具有相同的名称,但我没有检查。不管怎样,数据现在被推送了。