1

我在让复制功能适用于我的本地 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端,因为我在运行 Android 代码时确实看到了同步网关输出“POST /sync_gateway/_changes” 。谁能解释为什么复制不起作用?

更新 - 我能够确认我的设置已正确完成。我遇到的问题与我创建文档的方式有关。我通过管理控制台创建的那些没有被识别为有效文档所需的元数据。我最终通过推送复制通过我的应用程序填充数据库来填充服务器端数据库。通过 POST 请求创建文档也应该有效。

4

1 回答 1

1

如果您通过Admin Console添加文档,那么您将缺少中间的同步网关。特定文档(它的序列号)的更改跟踪在同步网关中维护。因此,当代理尝试提取文档时,它发现没有参考其本地数据库的更改,因此您什么也没有收到。要实际提取文档,您必须首先通过 Sync Gateway从您的代理推送它。Admin Console 直接将文档添加到与同步网关没有关联的服务器上的 SQL 表中。

于 2016-08-26T05:11:08.507 回答