couchbase客户端(android)视图返回空索引

时间:2015-06-17 06:10:17

标签: android couchbase couchbase-lite couchbase-view

我编写了一个视图,并通过同步网关将其插入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"))

1 个答案:

答案 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或其他。我不确定。有人可以解释一下细节吗?除了我插入的“类型”之外,文档中没有“类型”键,但我想从其他地方读取了错误的“类型”值。