Представление клиента couchbase (android) возвращает пустой индекс
Я написал представление и вставил его в сервер 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 для 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 ответ
Кажется, это была проблема со свойством, которое я указал как "тип". Я изменил имя ключа с "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" читалось откуда-то еще.