Java 为什么Android上使用加载程序和fts3表的listview是空的?
基本上,我的listview使用游标加载程序加载数据,在正常的表中显示良好,但一旦我将表转换为fts3(使用MATCH进行搜索),它就停止显示数据 表格声明:Java 为什么Android上使用加载程序和fts3表的listview是空的?,java,android,sql,sqlite,listview,Java,Android,Sql,Sqlite,Listview,基本上,我的listview使用游标加载程序加载数据,在正常的表中显示良好,但一旦我将表转换为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
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"+");";
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;
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;
}
onCreateCursorLoader:
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"+");";
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;
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;
}
我还注意到,当我删除where参数时,它起了作用(但我需要该参数)
内容提供商:
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"+");";
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;
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表无法支持游标加载程序()或查询()
总的来说,fts3默认情况下不支持括号,我发现上面两个方法的选择参数在执行时自动位于括号内。由于这个原因,我的listview是空的,这就是为什么一旦删除where子句,它就会再次工作。但是,我需要这个选择参数,在一天结束时,我还没有一个实际的解决方案来解决搜索互联网后的问题。您是否尝试“手动”执行sqlite3应用程序并测试您的查询?