【发布时间】: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