Представление клиента Couchbase (Android) возвращает пустой индекс

Я написал представление и вставил его в сервер 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 для 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».

Я также попытался получить документ по идентификатору. Это отлично работало для документов, вставленных с телефона, а также для документов, вставленных на сервер с других телефонов.

Я вставил следующую строку кода после функции карты:

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

person Apple    schedule 17.06.2015    source источник


Ответы (1)


Кажется, это была проблема со свойством, которое я указал как «тип». Я изменил имя ключа с «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 или что-то еще. Я не уверен. Может ли кто-нибудь объяснить подробности? В документе не было ключа «тип», кроме «типа», который я вставил, но я предполагаю, что неправильное значение «типа» считывалось откуда-то еще.

person Apple    schedule 17.06.2015