从Android SQLite游标中删除行

时间:2011-03-15 19:03:50

标签: android sqlite cursor

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

4 个答案:

答案 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包装器关闭。这很烦人。