[英]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。
我試過的:
例如,如果 ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true,我需要像 String[] whereArgs = new String[] {"Basic","Common","Rare"} 之類的東西我不能用類似“添加”方法的東西相應地創建它。
例如,如果我的 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 子句應該是什么樣子。 但是假設:
:-
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.........`
}
以上使用(來自活動)進行了測試:-
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 = ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.