2016-01-18 2 views
0

Я сделал фильтр и фильтровал значения с кушетки. Только в первый раз я могу получить правильные значения фильтра, после чего он каждый раз сохраняет предыдущие значения фильтра. Поэтому я должен каждый раз очищать кеш. Пожалуйста помоги.Couchbase - запрос не обновляется

Вот мой код запроса.

public Query getFilterQuery(final String titles, final String sender, 
      final String sysName, final String prosName, final String fromDate, 
      final String toDate) { 

     final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     com.couchbase.lite.View view = database.getView(FILTER_VIEW); 
     if (view.getMap() == null) { 
      Mapper mapper = new Mapper() { 
       public void map(Map<String, Object> document, Emitter emitter) { 

        String type = (String) document.get(AppConstants.KEY_DOC_TYPE); 
        if (AppConstants.DOC_TYPE_MESSAGE.equals(type)) { 

         String message_type = (String) document.get(AppConstants.MESSAGE_TYPE); 

         Log.d("message_type", message_type); 
         if (message_type.equals("task")) { 
          String msgDetails = (String) document.get(AppConstants.MESSAGE_BODY); 
          try { 
           JSONObject msgObj = new JSONObject(msgDetails); 
           DocumentReader documentReader = mApplication 
             .getDocumentReader(message_type); 
           documentReader.setJsonObject(msgObj); 
           String title = (String) documentReader.getValue("task.title"); 
           JSONArray infoArray = (JSONArray) documentReader.getValue("task.info"); 
           String taskDate = null; 
           String senderName = null; 
           String processName = null; 
           for (int i = 0; i < infoArray.length(); i++) { 
            JSONObject jObject = infoArray 
              .getJSONObject(i); 
            String field_label = jObject 
              .getString(AppConstants.LABEL); 

            if (field_label.equals(TASK_DATE)) { 
             taskDate = jObject 
               .getString(AppConstants.FIELD_VALUE); 
             Log.d("taskDate", taskDate); 
            } 
            if (field_label.equals(SENDER)) { 
             senderName = jObject 
               .getString(AppConstants.FIELD_VALUE); 
            } 
            if (field_label.equals(PROCESS_NAME)) { 
             processName = jObject 
               .getString(AppConstants.FIELD_VALUE); 
            } 
           } 
           Date dateFrom = null; 
           Date dateTo = null; 

           try { 

            date = dateFormat.parse(taskDate); 
            Log.d("taskDate", taskDate); 
            if (toDate != null && fromDate != null) { 
             dateTo = dateFormat.parse(toDate); 
             dateFrom = dateFormat.parse(fromDate); 
            } 

           } catch (ParseException e) { 
            e.printStackTrace(); 
           } 

           /*if (titles != null && titles.contains(title)) { 
            emitter.emit(document.get(AppConstants.MESSAGE_ID),document); 
           }*/ 

           if (senderName != null && senderName.contains(sender)) { 
            emitter.emit(document.get(AppConstants.MESSAGE_ID),document); 
           } 

           /*if (processName != null && processName.contains(prosName)) { 
            emitter.emit(document.get(AppConstants.MESSAGE_ID),document); 
           }*/ 

           /*if (date.before(dateTo) && date.after(dateFrom)) { 
            emitter.emit(document.get(AppConstants.MESSAGE_ID),document); 
           }*/ 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       } 
      }; 
      view.setMap(mapper, "1"); 

     } 
     Query query = view.createQuery(); 
     return query; 

    } 
} 

ответ

2

запроса в Couchbase-Lite разделен на 2 части.

  1. Настройка просмотра (в основном - индекс)
  2. Запуск запроса к представлению.

Вы должны создать ваш просмотр только один раз (ваш картограф) и запустить с ним запросы с поисковым термином под ключом запуска и конечным ключом. Вы также можете сделать составной индекс, который является в основном строковым соединением из нескольких ключей и его поиском.

Если вы задали карту каждый раз, когда вы запускаете запрос, запрос не будет обновляться, поскольку он смотрит на ваш аргумент версии и всегда устанавливается строка «1».

Если вы измените его, вы получите новый указатель для запроса - но его следует использовать только в dev при изменении вашего вида.

Roi.

+0

Не могли бы вы дать мне образец кода, и в моем поиске есть 6 строк так, как я могу использовать strtKey и endkey с этим. –

+0

Когда вы испускаете свой ключ, вы можете использовать emit (doc [someKey] + "_" + doc [someKey2], значение); после этого в начале запуска вы должны создать свой поисковый запрос, например docKey1_docKey2. Я попытаюсь написать несколько примеров как можно скорее. –