我查询并获取结果集,但我需要在SQLite WHERE子句中进行一些不可能的计算,以确定ListView中显示的内容。如何从光标中删除某些行?我知道这是与Filter rows from Cursor so they don't show up in ListView相同的问题,但答案没有帮助。如果没有更简单的方法可以提供一个例子吗?
答案 0 :(得分:4)
可能只是保留Cursor中的所有行,但随后使用自定义适配器在显示时隐藏不需要的行。例如,如果您扩展CursorAdapter
,那么您的bindView
实施中可能会出现类似内容:
View v = view.findViewById(R.id.my_list_entry);
boolean keepThisRow = .......; // do my calculations
v.setVisibility(keepThisRow ? View.VISIBLE : View.GONE);
答案 1 :(得分:3)
应该有更好的方法来做到这一点,但我最终做的是在字符串ArrayList中存储我想要的每一行的ID,然后重新查询_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;
}
答案 2 :(得分:0)
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”将返回所有内容。
答案 3 :(得分:0)
我需要做一些计算 在SQLite WHERE中是不可能的 条款
我觉得这很难相信;我的经验是,SQL会让你查询几乎所有你需要的东西(除了SQLite案例中的层次结构或递归查询)。如果您需要的某些功能不受支持,您可以使用sqlite_create_function()轻松添加它,并在您的应用中使用它。或者也许创造性地使用SELECT子句可以做你想要的。
你能解释一下这些不可能的计算是什么吗?
编辑:没关系,签出this webpage表明sqlite_create_function()适配器全部由Android SQLite包装器关闭。这很烦人。