0

ビューを作成し、同期ゲートウェイを介してソファベース サーバーに挿入しました。couchbase コンソールで [Show Results] をクリックすると、1 つのドキュメントが返されます。このビューはプロダクション ビューであり、開発ビューではありません。Android アプリケーションからこのビューにアクセスしようとすると、空のインデックスが返されました。また、アプリケーションにビューを書き込んでみました。これも空のインデックスを返しました。問題が見つからないようです。どんな助けでも大歓迎です。ありがとうございました!

これは、同期ゲートウェイの管理ポート (:4985) への REST API 呼び出しによって同期ゲートウェイを介して挿入された後のビューです:-

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" を持つ 1 つのドキュメントを返します。データベースには、このタイプのドキュメントが 1 つだけあります。

これは、私が 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());
}

これは、query.run() の logcat の出力です:-

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でドキュメントを取得しようとしました。これは、電話から挿入されたドキュメントだけでなく、他の電話からサーバーに挿入されたドキュメントでも問題なく機能しました。

map 関数の後に次のコード行を挿入しました:-

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"))
4

1 に答える 1

0

「type」として指定したプロパティに問題があったようです。キー名を「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またはそれ以外と見なしていたと思います。わからない。誰か詳細を説明してもらえますか? ドキュメントには、挿入した「type」以外の「type」キーはありませんでしたが、間違った「type」値が別の場所から読み取られていたと思われます。

于 2015-06-17T07:36:55.613 に答える