[英]Why is listview that uses loaders empty with fts3 table on Android?
基本上,使用CursorLoader加载数据的列表视图在普通表中显示正常,但是一旦将表转换为fts3(以使用MATCH进行搜索),它便停止显示数据。
表声明:
public static final String NOTES_SCHEMA="CREATE VIRTUAL TABLE "+TABLE_NAME+" USING fts3("+
"_id INTEGER PRIMARY KEY"+COMMA+NOTE_TITLE+" TEXT"+COMMA+NOTE_TEXT+" TEXT"+COMMA+TRASH_STATUS+" INTEGER DEFAULT 0"+COMMA+TIME+" INTEGER"+");";
onCreateCursorLoader:
case LOADER_NOTELIST_ID:
String[] projection = new String[]{NotesModel.NotesTable._ID, NotesModel.NotesTable.NOTE_TITLE, NotesModel.NotesTable.NOTE_TEXT,NotesModel.NotesTable.TIME,NotesModel.NotesTable.TRASH_STATUS};
String sortOrder = NotesModel.NotesTable.TIME+ " DESC";
String where = NotesModel.NotesTable.TRASH_STATUS+"=0";
CursorLoader cursorLoader = new CursorLoader(getApplicationContext().getApplicationContext(), uri, projection, where, null , sortOrder
);
return cursorLoader;
我还注意到,当我删除where参数时,它起作用了(但我需要该参数)。
内容提供商:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
Cursor cursor;
switch (uriMatcher.match(uri)) {
case NOTES_LIST://display the whole list, for main activity
qb.setTables(NotesModel.NotesTable.TABLE_NAME);//set table to be queried
break;
case NOTES_ITEM:
qb.setTables(NotesModel.NotesTable.TABLE_NAME);
qb.appendWhere(NotesModel.NotesTable._ID + " = "+ uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Invalid URI: " + uri);
}
cursor = qb.query(db,projection,selection,selectionArgs,null,null,sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);//observer for loader
return cursor;
}
任何意见或解决方案将不胜感激。
经过大量研究,我得出的结论是,由于参数的原因,fts3表仅不支持CursorLoader()或query() 。
总体而言,fts3默认情况下不支持括号,并且我发现上述两个方法的选择参数在执行时自动位于括号内。 出于这个原因,我的列表视图为空,这就是为什么一旦除去where子句后,它就会再次起作用。 但是,我需要该选择参数,最终,在搜索互联网后,我没有解决此问题的实际解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.