我查询并获取了结果集,但是我需要进行一些在SQLite WHERE子句中不可能完成的计算,以确定在ListView中显示什么。 我该如何从游标中删除某些行? 我知道这与Filter rows from Cursor so they don't show up in ListView是相同的问题,但该答案没有帮助。 如果没有更简单的方法,是否可以提供一个示例?
也许直接保留游标中的所有行,但在显示时使用自定义适配器隐藏不需要的行是可行的。例如,如果您扩展了CursorAdapter
,那么您的bindView
实现可能会像这样:
View v = view.findViewById(R.id.my_list_entry);
boolean keepThisRow = .......; // do my calculations
v.setVisibility(keepThisRow ? View.VISIBLE : View.GONE);
应该有更好的方法来完成这个任务,但我最终做的是将我想要的每一行的ID存储在一个字符串ArrayList中,然后重新查询其中_id IN arraListOfIds.toString(),将方括号替换为圆括号以适应SQL语法。
// Get all of the rows from the database
mTasksCursor = mDbHelper.fetchAllTasks();
ArrayList<String> activeTaskIDs = new ArrayList<String>();
// calculate which ones belong
// .....
if (!hasCompleted)
activeTaskIDs.add(mTasksCursor.getString(TaskerDBadapter.INDEX_ID));
// requery on my list of IDs
mTasksCursor = mDbHelper.fetchActiveTasks(activeTaskIDs);
public Cursor fetchActiveTasks(ArrayList<String> activeTaskIDs)
{
String inClause = activeTaskIDs.toString();
inClause = inClause.replace('[', '(');
inClause = inClause.replace(']', ')');
Cursor mCursor = mDb.query(true, DATABASE_TABLE, columnStringArray(),
KEY_ROWID + " IN " + inClause,
null, null, null, null, null);
if (mCursor != null) { mCursor.moveToFirst(); }
return mCursor;
}
ContentResolver cr = getContentResolver();
Cursor groupCur = cr.query(
Groups.CONTENT_URI, // what table/content
new String [] {Groups._ID, Groups.NAME}, // what columns
"Groups.NAME NOT LIKE + 'System Group:%'", // where clause(s)
null, // ???
Groups.NAME + " ASC" // sort order
);
编辑:算了,查看这个网页后发现Android SQLite包装器已经封闭了sqlite_create_function()适配器。真烦人。