从Android SQLite Cursor中删除行

3
我查询并获取了结果集,但是我需要进行一些在SQLite WHERE子句中不可能完成的计算,以确定在ListView中显示什么。 我该如何从游标中删除某些行? 我知道这与Filter rows from Cursor so they don't show up in ListView是相同的问题,但该答案没有帮助。 如果没有更简单的方法,是否可以提供一个示例?
4个回答

4

也许直接保留游标中的所有行,但在显示时使用自定义适配器隐藏不需要的行是可行的。例如,如果您扩展了CursorAdapter,那么您的bindView实现可能会像这样:

View v = view.findViewById(R.id.my_list_entry);
boolean keepThisRow = .......; // do my calculations
v.setVisibility(keepThisRow ? View.VISIBLE : View.GONE);

3

应该有更好的方法来完成这个任务,但我最终做的是将我想要的每一行的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;
    }

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”将返回所有行。

我并没有完全理解这个,但我认为它并没有解决我的问题。我不能使用列名,我需要根据列值进行代码计算,以确定将选择哪些行。 - 333Matt

0
我需要进行一些在SQLite WHERE子句中无法实现的计算。
我觉得这很难相信;我的经验是,SQL可以让你查询几乎所有你需要的东西(除了SQLite的情况下的分层或递归查询)。如果有一些不支持的函数,你可以使用sqlite_create_function()轻松添加它并在应用程序中使用它。或者也许SELECT子句的创造性使用可以做到你想要的事情。
你能解释一下这些不可能的计算是什么吗?

编辑:算了,查看这个网页后发现Android SQLite包装器已经封闭了sqlite_create_function()适配器。真烦人。


哼,Postgres SQL 可能足够了,但 SQLite 绝对不行... 想想一些地理查询(这在 SQLite 中非常麻烦)。 - Laurent Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接