Удаление строк из курсора SQLite для Android - PullRequest
2 голосов
/ 15 марта 2011

Я запрашиваю и возвращаю набор результатов, но мне нужно выполнить некоторые вычисления, которые невозможны в предложении SQLite WHERE, чтобы определить, что отображается в ListView. Как я могу удалить определенные строки из курсора? Я знаю, что это тот же вопрос, что и этот Фильтр строк из курсора, поэтому они не отображаются в ListView , но этот ответ не помогает. Можно ли привести пример, если нет более простого способа сделать это?

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

Может быть просто сохранить все строки в курсоре, но затем использовать специальный адаптер, чтобы скрыть ненужные строки во время отображения. Например, если вы расширяете CursorAdapter, то у вас может быть что-то подобное в вашей реализации bindView:

View v = view.findViewById(R.id.my_list_entry);
boolean keepThisRow = .......; // do my calculations
v.setVisibility(keepThisRow ? View.VISIBLE : View.GONE);
3 голосов
/ 17 марта 2011

Должен быть лучший способ сделать это, но в итоге я сохранил идентификатор каждой строки, которую я хотел, в строке 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 голосов
/ 17 марта 2011

Мне нужно сделать некоторые вычисления, которые невозможны в предложении SQLite WHERE

Мне очень трудно в это поверить;По моему опыту, SQL позволит вам запрашивать практически все, что вам когда-либо понадобится (за исключением иерархических или рекурсивных запросов в случае SQLite).Если вам нужна какая-то функция, которая не поддерживается, вы можете легко добавить ее с помощью sqlite_create_function () и использовать в своем приложении.Или, возможно, творческое использование предложения SELECT может сделать то, что вы ищете.

Можете ли вы объяснить, что это за невозможные вычисления?


РЕДАКТИРОВАТЬ: Неважно, проверяя На этой веб-странице показано, что адаптер sqlite_create_function () полностью закрыт оболочкой Android SQLite.Это раздражает.

0 голосов
/ 15 марта 2011
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
        );

В приведенном выше фрагменте «Какие столбцы» вы можете указать курсору, какие строки возвращать. Использование «null» возвращает их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...