【发布时间】:2011-03-15 19:03:50
【问题描述】:
我查询并返回一个结果集,但我需要做一些在 SQLite WHERE 子句中不可能的计算,以确定 ListView 中显示的内容。如何从光标中删除某些行?我知道这与Filter rows from Cursor so they don't show up in ListView 的问题相同,但该答案无济于事。如果没有更简单的方法可以提供示例吗?
【问题讨论】:
我查询并返回一个结果集,但我需要做一些在 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 中,然后重新查询 where _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
);
上面的“What Columns”部分是您可以告诉光标返回哪些行的地方。使用“null”会全部返回。
【讨论】:
我需要做一些计算 在 SQLite WHERE 中是不可能的 子句
我觉得这很难相信;我的经验是,SQL 可以让你查询几乎任何你需要的东西(除了 SQLite 的分层或递归查询)。如果您需要的某些功能不受支持,您可以使用 sqlite_create_function() 轻松添加它并在您的应用程序中使用它。或者,也许创造性地使用 SELECT 子句可以满足您的需求。
你能解释一下这些不可能的计算是什么吗?
编辑:没关系,查看this webpage 显示 sqlite_create_function() 适配器已全部被 Android SQLite 包装器关闭。这很烦人。
【讨论】: