android - 用于切换按钮的 SQLite 动态 where 子句
问题描述
我想创建一个动态 where 子句之类的东西,但要与之斗争。
FrameWork: 我想使用 4 个 Togglebuttons,这显然会给我返回“Togglebutton.ischecked()”一个真或假布尔值。据此,我想选择我的数据库的正确课程。Togglebuttons 的值是“Basic”、“Common”、“Uncommon”和“Rare”。如果按下 Togglebuttons,它会调用 DB 方法,然后使用数据库的数据设置我的布局。
问题: 我在创建正确的查询时遇到问题,该查询会相应地更改 whereArguments 和 whereClause。根据我的理解,whereClause 需要一个字符串,而 whereSelection 需要一个 StringArray。
我尝试了什么:
- 我尝试相应地创建一个 StringArray,这会产生固定索引的问题。因此,我在创建智能逻辑时遇到了问题,该逻辑会产生正确的 StringArray,
例如,如果 ToggleButton (tb) tbBasic = true, tbUncommon = false, tbCommon = true, tbRare = true, 我需要类似 String[] whereArgs = new String[] {"Basic","Common","Rare"} 而我不能用类似“添加”的方法来创建它。
- 因此,我尝试使用 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 来自表,需要更改。
推荐阅读
- c++ - 在 C++ 中解析长字符串的好习惯是什么?
- oracle-apex - 使用 API 进行 PL/SQL 输入验证
- python - 无法将每日情绪评分与每日价格合并
- python - 单击没有使用 selenium 的 id 的提交按钮
- google-chrome - 谷歌浏览器屏幕共享历史
- json - ElasticSearch 特定 JSON
- python - 使用 pyspark 转换时 databricks 和 Google Colab 的不同结果
- vue.js - Gridsome 查找当前 URL
- jestjs - 将多个模拟文件/服务组合成一行
- subprocess - Python嵌套子进程实时输出