我编写了一个视图,并通过同步网关将其插入couchbase服务器。当我在couchbase控制台中单击“显示结果”时,它将返回一个文档。此视图是生产视图,而不是开发视图。当我尝试从Android应用程序访问此视图时,它返回一个空索引。 我也尝试在应用程序中编写视图。这也返回了一个空索引。我似乎无法找到问题。任何帮助,将不胜感激。谢谢!
这是通过Rest API调用同步网关的管理端口(:4985)通过同步网关插入后的视图: -
function(doc,meta) {
var sync = doc._sync;
if (sync === undefined || meta.id.substring(0,6) == "_sync:")
return;
if ((sync.flags & 1) || sync.deleted)
return;
delete doc.sync;
meta.rev = sync.rev;
(function (doc, meta) { if (doc.type != null && doc.type== "ReferenceClass") { emit(doc.type, doc); }}) (doc, meta);
}
这将返回一个type =“ReferenceClass”的文档。数据库中只有一个这种类型的文档。
这是我在android应用程序中写的视图: -
com.couchbase.lite.View viewItems = database.getView(String.format("%s/%s", "design_document", "view2"));
viewItems.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if (document.get("type") != null && document.get("type") == "ReferenceClass")
emitter.emit(document.get("type"), document);
}
}, "1.0");
在这里,我也尝试将版本号更新为“2”,但问题仍然存在。
这是我查询和构建索引的地方: -
Query query = database.getView("design_document/view2").createQuery();
QueryEnumerator result = query.run();
System.out.println("*************** query count="+result.getCount());
for(Iterator<QueryRow> it=result; it.hasNext();){
QueryRow row=it.next();
System.out.println("*************** row="+row.toString());
}
这是logcat for query.run()的输出: -
Re-indexing view: design_document/view2
I/CBLite﹕ main Begin transaction (level 1)
V/View﹕ lastSequence (3) == dbMaxSequence (3), nothing to do
I/CBLite﹕ main Committing transaction (level 1)
V/View﹕ Query design_document/view2: SELECT key, value, docid, revs.sequence FROM maps, revs, docs WHERE maps.view_id=? AND revs.sequence = maps.sequence AND docs.doc_id = revs.doc_id ORDER BY key LIMIT ? OFFSET ? | args: [2, 2147483647, 0]
D/CBLite﹕ Query view design_document/view2 completed in 6 milliseconds
I/System.out﹕ *************** query count=0
我使用手机插入了“ReferenceClass”类型的文档,因此它应该在CBlite数据库中。我没有将它插入“_local”数据库。
我也试过通过Id获取文档。这适用于从手机插入的文件,以及从其他手机插入服务器的文件。
我在地图功能之后插入了以下代码行: -
System.out.println("************** view index=" + viewItems.dump().toString());
我收到了以下结果: -
I/System.out﹕ ************** view index=[]
我也试过改变
if (document.get("type") != null && document.get("type") == "ReferenceClass")
声明
if (document.get("type") != null && document.get("type").equals("ReferenceClass"))
答案 0 :(得分:0)
这似乎是我指定为“类型”的属性的问题。我将密钥名称从“type”更改为“type_doc”,现在查询运行正常。所以现在我的地图功能如下: -
com.couchbase.lite.View viewItems = database.getView(String.format("%s/%s", "design_document", "view2"));
viewItems.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if (document.get("type_doc") != null && document.get("type_doc") == "ReferenceClass")
emitter.emit(document.get("type_doc"), document);
}
}, "1.0");
我猜它认为“类型”是JSON或其他。我不确定。有人可以解释一下细节吗?除了我插入的“类型”之外,文档中没有“类型”键,但我想从其他地方读取了错误的“类型”值。