簡體   English   中英

ToggleButtons 的 SQLite 動態 where 子句

[英]SQLite Dynamic where-clause for ToggleButtons

我想創建一個類似於動態 where 子句的東西,但與之斗爭。

FrameWork:我想使用 4 個 Togglebuttons,這顯然返回給我“Togglebutton.ischecked()”一個 true 或 false 布爾值。 據此我想選擇我的數據庫的正確課程。 Togglebuttons 具有值“Basic”、“Common”、“Uncommon”和“Rare”。 如果按下 Togglebuttons,它會調用 DB 方法,然后使用數據庫的數據設置我的布局。

問題:我在創建正確的查詢時遇到問題,該查詢會相應地更改 whereArguments 和 whereClause。 根據我的理解,whereClause 需要一個字符串,而 whereSelection 需要一個 StringArray。

我試過的:

  1. 我嘗試相應地創建一個 StringArray,這產生了具有固定索引的問題。 因此我在創建一個智能邏輯時遇到了問題,它產生了正確的 StringArray,

例如,如果 ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true,我需要像 String[] whereArgs = new String[] {"Basic","Common","Rare"} 之類的東西我不能用類似“添加”方法的東西相應地創建它。

  1. 因此,我嘗試使用 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 長於一個 Element 的情況下, whereClause 也需要相同數量的元素。

我希望我說清楚了我願意嘗試任何建議

您還沒有指定 WHERE 子句應該是什么樣子。 但是假設:

  • a) 按鈕都適用於單個列( COL_TASK_TITLE (相當於字符串標題)在下面的代碼中使用)和
  • b)如果多個按鈕是真的,你想要選擇包含值和
  • 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 又名 Database Helper 子類中的一個方法。

以上使用(來自活動)進行了測試:-

    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 來自一個表,需要更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM