Android Couchbase Lite 复制
Android Couchbase Lite Replication
我在让复制功能为我的本地 Couchbase 数据库和我的 Android 应用程序工作时遇到问题:
private void startSync() {
URL syncUrl;
try {
syncUrl = new URL("http://10.0.2.2:4984/sync_gateway"); // I am testing with the Android emulator
manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS);
database = manager.getDatabase("db");
Replication pullReplication = database
.createPullReplication(syncUrl);
pullReplication.setContinuous(true);
pullReplication.addChangeListener(this);
pullReplication.start();
}
catch (MalformedURLException e) {
throw new RuntimeException(e);
}
catch (IOException e) {
e.printStackTrace();
}
catch (CouchbaseLiteException e) {
e.printStackTrace();
}
Query query = database.createAllDocumentsQuery();
query.setAllDocsMode(Query.AllDocsMode.ALL_DOCS);
QueryEnumerator result;
try {
result = query.run();
for (Iterator<QueryRow> it = result; it.hasNext(); ) {
QueryRow row = it.next();
Log.i("CouchActivity", "Getting document i: " + row.getDocumentId());
}
}
catch (CouchbaseLiteException e) {
e.printStackTrace();
}
}
创建拉取复制后,我继续查询本地数据库的所有文档,但未返回任何文档。
我的同步网关配置文件如下:
{
"interface": ":4984",
"adminInterface": ":4985",
"log": ["REST"],
"databases": {
"sync_gateway": {
"server": "http://localhost:8091",
"bucket": "stations",
"sync": `function(doc) {channel(doc.channels);}`,
"users": { "GUEST": { "disabled": false, "admin_channels": ["*"] } }
}
}
}
当我输入 localhost:4984/sync_gateway 时,我得到的响应是“
{"committed_update_seq":1,"compact_running":false,"db_name":"sync_gateway","disk_format_version":0,"instance_start_time":1471324911376777,"purge_seq":0,"state":"Online","update_seq":1}"
不确定问题是否出在 Android 端,因为我看到同步网关 output "POST /sync_gateway/_changes" 当我 运行 我的 Android 代码。谁能解释为什么复制不起作用?
更新 - 我能够确认我的设置是否正确完成。我遇到的问题与我创建文档的方式有关。我通过管理控制台创建的文档没有被识别为有效文档所需的元数据。我最终通过推送复制通过我的应用程序填充数据库来填充服务器端数据库。通过 POST 请求创建文档也应该有效。
如果您是通过 管理控制台 添加文档,则您缺少中间的 Sync Gateway。对特定文档(其序列号)的更改跟踪在同步网关中进行维护。因此,当代理试图拉取文档时,它没有发现对其本地数据库的引用发生任何变化,因此您什么也得不到。
要实际提取文档,您必须首先通过同步网关从您的代理推送它。管理控制台直接将文档添加到与同步网关没有关联的服务器的 SQL 表中。
我在让复制功能为我的本地 Couchbase 数据库和我的 Android 应用程序工作时遇到问题:
private void startSync() {
URL syncUrl;
try {
syncUrl = new URL("http://10.0.2.2:4984/sync_gateway"); // I am testing with the Android emulator
manager = new Manager(new AndroidContext(this), Manager.DEFAULT_OPTIONS);
database = manager.getDatabase("db");
Replication pullReplication = database
.createPullReplication(syncUrl);
pullReplication.setContinuous(true);
pullReplication.addChangeListener(this);
pullReplication.start();
}
catch (MalformedURLException e) {
throw new RuntimeException(e);
}
catch (IOException e) {
e.printStackTrace();
}
catch (CouchbaseLiteException e) {
e.printStackTrace();
}
Query query = database.createAllDocumentsQuery();
query.setAllDocsMode(Query.AllDocsMode.ALL_DOCS);
QueryEnumerator result;
try {
result = query.run();
for (Iterator<QueryRow> it = result; it.hasNext(); ) {
QueryRow row = it.next();
Log.i("CouchActivity", "Getting document i: " + row.getDocumentId());
}
}
catch (CouchbaseLiteException e) {
e.printStackTrace();
}
}
创建拉取复制后,我继续查询本地数据库的所有文档,但未返回任何文档。
我的同步网关配置文件如下:
{
"interface": ":4984",
"adminInterface": ":4985",
"log": ["REST"],
"databases": {
"sync_gateway": {
"server": "http://localhost:8091",
"bucket": "stations",
"sync": `function(doc) {channel(doc.channels);}`,
"users": { "GUEST": { "disabled": false, "admin_channels": ["*"] } }
}
}
}
当我输入 localhost:4984/sync_gateway 时,我得到的响应是“
{"committed_update_seq":1,"compact_running":false,"db_name":"sync_gateway","disk_format_version":0,"instance_start_time":1471324911376777,"purge_seq":0,"state":"Online","update_seq":1}"
不确定问题是否出在 Android 端,因为我看到同步网关 output "POST /sync_gateway/_changes" 当我 运行 我的 Android 代码。谁能解释为什么复制不起作用?
更新 - 我能够确认我的设置是否正确完成。我遇到的问题与我创建文档的方式有关。我通过管理控制台创建的文档没有被识别为有效文档所需的元数据。我最终通过推送复制通过我的应用程序填充数据库来填充服务器端数据库。通过 POST 请求创建文档也应该有效。
如果您是通过 管理控制台 添加文档,则您缺少中间的 Sync Gateway。对特定文档(其序列号)的更改跟踪在同步网关中进行维护。因此,当代理试图拉取文档时,它没有发现对其本地数据库的引用发生任何变化,因此您什么也得不到。 要实际提取文档,您必须首先通过同步网关从您的代理推送它。管理控制台直接将文档添加到与同步网关没有关联的服务器的 SQL 表中。