我制作了一个过滤器并过滤了沙发基座的值。只有第一次我能够获得正确的过滤器值,之后它每次都会返回先前的过滤器值。所以我每次都要清除缓存。请帮忙。
这是我的查询代码。
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;
}
}
答案 0 :(得分:2)
Couchbase-lite中的查询分为两部分。
您应该只创建一次视图(您的映射器)并使用startkey和endkey下的搜索项对其进行查询。 你也可以做一个复合索引,它基本上是来自几个键的字符串复合并由它搜索。
如果您每次运行查询时都设置了地图 - 查询将不会更新,因为它会查看您的版本参数,并且它始终设置为字符串&#34; 1&#34;。
如果您要更改它,您将获得一个新的索引查询 - 但是只有在您更改视图时才能在dev中使用它。
投资回报率。