【问题标题】:Android - Couchbase lite - pull with filter - Replication.setFilterAndroid - Couchbase lite - 使用过滤器拉取 - Replication.setFilter
【发布时间】:2017-11-10 10:21:24
【问题描述】:

我正在开发一个 android messagerie 应用程序,消息存储在 Internet 上的 CouchDB(Apache) 数据库中。 如何在我的 Android 设备上使用过滤器提取消息?

Android 代码段:

Replication pull = new Replication(messageDB, messageUrl, Replication.Direction.PULL);

//filter
pull.setFilter("message/by_username");
HashMap<String, Object> filterParams = new HashMap<>();
filterParams.put("username", usr);
pull.setFilterParams(filterParams);

pull.setContinuous(false); //oneshot
pull.start();

Apache 设计文档:

{
  "_id": "_design/message",
  "views": {
    "by_username": {
      "map": "function (doc) {\n  emit([doc.username]);\n  \n}"
    }
  },
  "filters": {
    "by_username": "function(doc, req){ if(!doc.username) return false; if(req.query.username && req.query.username != doc.username){return false} else {return true}}"
  },
  "language": "javascript"
}

使用块过滤器,同步永远不会停止,但数据库总是空的(3分钟后我没有找到任何文档)。

没有阻止过滤器,所有消息都在几秒钟内下载完毕。 谢谢。

【问题讨论】:

  • 您能否尝试添加具有特定用户名的文档(例如:foo 小写)。然后,在您的 Java 代码中,过滤硬编码值 foo)。如果还是不行,尝试直接在CouchDB界面中使用你的filter函数,复制到另外一个db,看看是不是你的filter出了问题。
  • 如何在 CouchDB 界面中直接使用我的过滤功能?我可以使用过滤器进行 CouchDB 复制,但我必须在请求正文中添加我的参数。从 CouchBase 中,我可以与 url 同步,但我没有找到在复制对象中添加参数的任何方法。
  • 我只知道使用过滤器复制 CouchDB 的方法,可以在此链接中找到:wiki.apache.org/couchdb/Replication{"source":"http://example.org/example-database","target":"http://admin:password@127.0.0.1:5984/example-database", "filter":"myddoc/myfilter", "query_params": {"key":"value"}}
  • 如果你用 curl 试一下,它会按预期工作吗?
  • Couchbase lite 有一个known bug when using a filter function with CouchDB。似乎 Couchbase lite 将其过滤器功能更新为 POST 并且 CouchDB 期待 GET。您可以阅读链接的 github 问题以了解可能的解决方法。

标签: android couchdb database-replication pull couchbase-lite


【解决方案1】:

来源:https://developer.couchbase.com/documentation/mobile/current/guides/couchbase-lite/native-api/replication/index.html#filtered-pull-from-couchdb-pouchdb-or-cloudant

从 CouchDB、PouchDB 或 Cloudant 过滤拉取

自 Couchbase Lite 1.2 起,非 Couchbase 数据库的拉取复制中的过滤器功能不再可用。在 POST /{db}/_changes 请求中处理过滤器参数的方式不兼容(参见 #1139)。

【讨论】:

    【解决方案2】:

    但是,有一种解决方法可以使用 couchbase lite 1.4 和 couchdb 2.x 服务器来工作,而无需对上述库进行任何更改。 请参考here的答案

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多