代码之家  ›  专栏  ›  技术社区  ›  mrmeaaan

切换按钮的sqlite dynamic where子句

  •  1
  • mrmeaaan  · 技术社区  · 8 年前

    我想创建一个动态的WHERE子句,但是要与它作斗争。

    框架: 我想使用4个toggleButton,这显然会返回“toggleButton.ischecked()”一个正确或错误的布尔值。根据这一点,我想选择我的数据库中正确的课程。 切换按钮具有“基本”、“普通”、“不常见”和“罕见”值。 如果按下了ToggleButtons,它将调用DB方法,该方法将使用数据库的数据设置布局。

    问题: 我在创建正确的查询时遇到问题,该查询会相应地更改WhereArguments和WhereClause。根据我的理解,WHERE子句需要一个字符串,WHERESELECTION需要一个字符串数组。

    我尝试过:

    1. 我尝试相应地创建一个StringArray,这就产生了一个固定索引的问题。因此,我在创建智能逻辑时遇到了一些问题,该逻辑生成了正确的StringArray,

    例如,如果togglebutton(tb)tb basic=true、tbunchrome=false、tb common=true、tb稀有=true,我需要类似于string[]的内容,其中args=new string[]“basic”、“common”、“稀有”,但是我不能用类似于“add”的方法创建相应的内容。

    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);
    

    问题是显然,WHERE子句也必须相应地更新。因此,在arraylist长于一个元素的情况下,where子句也需要相同数量的元素。

    我希望我能澄清我的观点,我愿意尝试任何建议

    1 回复  |  直到 8 年前
        1
  •  1
  •   MikeT    8 年前

    您尚未指定WHERE子句的外观。但是假设:

    • a)所有按钮均适用于单列( 科尔斯塔斯克头衔 (相当于字符串标题)在下面的代码中使用)和
    • 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的子类中的一个方法,也称为数据库助手。

    使用(来自活动)测试上述内容:-

        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 = ? 
    
    • 注意表和列任务标题来自表,需要更改。
    推荐文章