ToggleButtons 的 SQLite Dynamic where-clause
SQLite Dynamic where-clause for ToggleButtons
我想创建类似动态 where 子句的东西,但很难做到。
框架:
我想使用 4 个切换按钮,显然 return 我用 "Togglebutton.ischecked()" 真或假布尔值。据此,我想为我的数据库选择正确的课程。
切换按钮具有值 "Basic"、"Common"、"Uncommon" 和 "Rare"。
如果按下 Togglebuttons,它会调用 DB 方法,然后使用数据库的数据设置我的布局。
问题: 我在创建正确的查询时遇到问题,该查询会相应地更改 whereArguments 和 whereClause。根据我的理解,whereClause 需要一个 String 而 whereSelection 需要一个 StringArray。
我试过的:
- 我尝试相应地创建一个 StringArray,这会产生具有固定索引的问题。因此,我在创建智能逻辑时遇到了问题,该逻辑会产生正确的 StringArray,
例如如果 ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true,我需要类似 String[] whereArgs = 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 比一个 Element 长的情况下,whereClause 也需要相同数量的元素。
我希望我表达清楚了,我愿意尝试任何建议
您尚未指定 WHERE 子句的外观。但是假设:
- a) 按钮全部应用于单个列(COL_TASK_TITLE(等同于字符串标题)在下面的代码中使用)和
- b) 如果多个按钮为真,您希望 select 包含值和
的行
- c) 还假设如果 none 被 select 编辑为您想要所有行,那么以下内容可能与您想要的内容一致
:-
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 的子类中的一个方法,又名数据库助手。
以上是使用(来自activity)测试的:-
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 来自 table,需要更改。
我想创建类似动态 where 子句的东西,但很难做到。
框架: 我想使用 4 个切换按钮,显然 return 我用 "Togglebutton.ischecked()" 真或假布尔值。据此,我想为我的数据库选择正确的课程。 切换按钮具有值 "Basic"、"Common"、"Uncommon" 和 "Rare"。 如果按下 Togglebuttons,它会调用 DB 方法,然后使用数据库的数据设置我的布局。
问题: 我在创建正确的查询时遇到问题,该查询会相应地更改 whereArguments 和 whereClause。根据我的理解,whereClause 需要一个 String 而 whereSelection 需要一个 StringArray。
我试过的:
- 我尝试相应地创建一个 StringArray,这会产生具有固定索引的问题。因此,我在创建智能逻辑时遇到了问题,该逻辑会产生正确的 StringArray,
例如如果 ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true,我需要类似 String[] whereArgs = 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 比一个 Element 长的情况下,whereClause 也需要相同数量的元素。
我希望我表达清楚了,我愿意尝试任何建议
您尚未指定 WHERE 子句的外观。但是假设:
- a) 按钮全部应用于单个列(COL_TASK_TITLE(等同于字符串标题)在下面的代码中使用)和
- b) 如果多个按钮为真,您希望 select 包含值和 的行
- c) 还假设如果 none 被 select 编辑为您想要所有行,那么以下内容可能与您想要的内容一致
:-
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 的子类中的一个方法,又名数据库助手。
以上是使用(来自activity)测试的:-
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 来自 table,需要更改。