我遇到了使复制功能适用于我的本地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时,我收到了&#34;
的回复{"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 方面有关,因为我看到同步网关输出&#34; POST / sync_gateway / _changes&#34; 当我运行我的Android代码。任何人都可以解释为什么复制不起作用吗?
更新 - 我能够确认我的设置已正确完成。我遇到的问题与我创建文档的方式有关。我通过管理控制台创建的那些没有为了被识别为有效文档所需的元数据。我最终通过推送复制通过我的应用程序填充数据库来填充服务器端数据库。通过POST请求创建文档也应该有效。
答案 0 :(得分:1)
如果您通过管理控制台添加文档,则您之间缺少同步网关。在Sync Gateway上维护对特定Document(它的序列号)的更改的跟踪。因此,当代理尝试提取文档时,它找不到对其本地数据库的引用的更改,因此您什么也得不到。 要实际提取文档,您必须先从代理通过Sync Gateway 推送文档。管理控制台直接将文档添加到服务器上的SQL表,该表与Sync网关无关。