SQLite Динамическое предложение where для ToggleButtons - PullRequest
0 голосов
/ 22 октября 2018

Я хотел бы создать что-то вроде динамического предложения where, но бороться с ним.

FrameWork: Я хочу использовать 4 кнопки-переключателя, которые, очевидно, возвращают меня с "Togglebutton.ischecked () "истинный или ложный логический.В соответствии с этим я хочу выбрать правильную программу в моей базе данных.Кнопки Toggle имеют значения «Basic», «Common», «Uncommon» и «Rare».Если нажата кнопка Togglebuttons, она вызывает метод DB, который затем приводит к настройке моего макета с данными базы данных.

Проблема: У меня проблемы с созданием правильного запроса, которыйизменяет whereArguments и whereClause соответственно.Из моего понимания whereClause требуется String, а whereSelection - StringArray.

Что я пробовал:

  1. Я попытался создать StringArray соответственно,что приводит к проблеме наличия фиксированного индекса.Поэтому у меня были проблемы с созданием умной логики, которая выдает правильный StringArray,

, например, если ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true,Мне нужно что-то вроде String [], где Args = new String [] {"Basic", "Common", "Rare"}, тогда как я не могу создать это соответствующим образом с помощью метода "add".

Поэтому я попытался использовать Arraylist, который позволяет очень легко добавлять и удалять в соответствии с переключателями.

Например, если вызывается мой метод DBHelper getAllHeros, я могу каждый раз создавать новый Arraylist, который выдает мне правильный whereArgs.

ArrayList<String> whereArgsList = new ArrayList<>();

        if(btnBasic){
            whereArgsList.add("Basic");
        }
        if(btnCommon){
            whereArgsList.add("Common");
            }
        if(btnUncommon){
            whereArgsList.add("Uncommon");
        }
        if(btnRare){
            whereArgsList.add("Rare");
        }
    Cursor c = db.query("TableHeros", null,whereClause, whereArgsList.toArray(new String[0]),null,null,null,null);

Проблема в том, чтоочевидно, что whereClause должен быть соответственно обновлен.Таким образом, в случае когда Arraylist длиннее, чем один элемент, whereClause также потребуется такое же количество элементов.

Я надеюсь, что я ясно изложил свою точку зрения, и я готов попробовать любые Предложения

1 Ответ

0 голосов
/ 22 октября 2018

Вы не указали, как должно выглядеть предложение WHERE.Однако при условии, что:

  • a) все кнопки применяются к одному столбцу ( COL_TASK_TITLE (что соответствует названию строки) используется в приведенном ниже коде) и
  • b) если для нескольких кнопок задано значение true, вы хотите выбрать строки, содержащие оба значения, и
  • c) также при условии, что, если ни одна из них не выбрана, вы хотите, чтобы все строки были следующими, тогда может быть следующееиз того, что вы хотите

: -

public Cursor getMyRows(boolean btnBasic, boolean btnCommon, boolean btnUncommon, boolean btnRare) {

    ArrayList<String> whereArgsList = new ArrayList<>();
    String whereclause = null;
    String[] whereargs = null;

    if(btnBasic){
        whereArgsList.add("Basic");
    }
    if(btnCommon){
        whereArgsList.add("Common");
    }
    if(btnUncommon){
        whereArgsList.add("Uncommon");
    }
    if(btnRare){
        whereArgsList.add("Rare");
    }
    StringBuilder whereclauseToBe = new StringBuilder();
    for(String s: whereArgsList) {
        if (whereclauseToBe.length() > 1) {
            whereclauseToBe.append(" OR ");
        }
        whereclauseToBe.append(COL_TASK_TITLE); //<<<<<<<<< change to your column
        whereclauseToBe.append(" = ? ");
    }
    if (whereclauseToBe.length() < 1) {
        Log.d("WHERE CLAUSE","No selections so WHERE CLAUSE and WHERE ARGS have been set as null");
    } else {
        whereclause = whereclauseToBe.toString();
        Log.d("WHERE CLAUSE ", "The generated WHERE CLAUSE would be... WHERE " + whereclauseToBe.toString());
    }
    if (whereArgsList.size() > 0) {
        whereargs = new String[whereArgsList.size()];
        whereargs = whereArgsList.toArray(whereargs);
    }

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor c =  db.query(TABLE, null,whereclause, whereargs ,null,null,null,null); //<<<<<<<<<< Change TABLE to table name
    return c; //<<<<<<<<<< Could just do `return db.query(TABLE.........`
}
  • Обратите внимание, что это метод в подклассе SQLiteOpenHelper или Помощника по базам данных.

Выше было проверено с использованием (из упражнения): -

    db.getMyRows(false,false,false,false);
    db.getMyRows(true,false,false,false);
    db.getMyRows(true,false,true,false);
    db.getMyRows(false,true,true,false);
    db.getMyRows(false,false,false,true);
    db.getMyRows(true,true,true,true);

Результаты, записанные в журнал были: -

10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: No selections so WHERE CLAUSE and WHERE ARGS have been set as null
10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: The generated WHERE CLAUSE would be... WHERE title = ? 
10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: The generated WHERE CLAUSE would be... WHERE title = ?  OR title = ? 
10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: The generated WHERE CLAUSE would be... WHERE title = ?  OR title = ? 
10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: The generated WHERE CLAUSE would be... WHERE title = ? 
10-22 04:44:23.975 1429-1429/? D/WHERE CLAUSE: The generated WHERE CLAUSE would be... WHERE title = ?  OR title = ?  OR title = ?  OR title = ? 
  • Примечание TABLE и COL_TASK_TITLE были изтаблица и должна быть изменена.
...