【问题标题】:Android SQLiteDatabase query with LIKE带有 LIKE 的 Android SQLiteDatabase 查询
【发布时间】:2012-01-31 08:34:18
【问题描述】:

我的 NAMES 表中有 3 个名字,Allakhazam、Beatbox 和 Cunning。

public Cursor fetchNamesByConstraint(String filter) {

    mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
            KEY_NAME }, KEY_NAME + " LIKE ?",
            new String[] { filter }, null, null, null,
            null);

    return mCursor;
}

我使用“A”作为过滤器调用该函数,但我的光标返回 0 计数,而它应该至少返回 1。任何人都可以看到代码有什么问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    此语句将返回所有keyname 等于string 指定的字符串的记录,如果使用通配符,则可以得到想要的结果。喜欢:

    mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
                KEY_NAME }, KEY_NAME + " LIKE ?",
                new String[] { filter+"%" }, null, null, null,
                null);
    

    将列出过滤器中以单词开头的所有记录。

    mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
                KEY_NAME }, KEY_NAME + " LIKE ?",
                new String[] {"%"+ filter+ "%" }, null, null, null,
                null);
    

    将列出过滤器中包含单词的所有记录。

    【讨论】:

    • 谢谢,这是为我做的,我看错地方了。
    • 为什么我们需要在上面的代码中的过滤器中添加 % 符号? @jeet
    • 因为 % 是通配符。 * 用于查询中的其他元素。
    【解决方案2】:
        public java.util.Vector<Products> getsearch(String subcategory,String searchby)
        {
            SQLiteDatabase db=this.getReadableDatabase();
    
            Cursor cursor = db.query(
                TABLE_PRODUCTS, 
                new String[] { SUBCATEGORY, MAIN_CATEGORY, PRODUCT_ID, PRODUCT_NAME, BRAND, PACKAGE_SIZE, PRICE }, 
                SUBCATEGORY + " LIKE '%" + subcategory + "%'",
                null, null, null, null, null);
        }
    

    【讨论】:

      【解决方案3】:

      你能试试这个.....代码.......

      public static final String KEY_ROWID="row";
      public static final String KEY_NAME="name";
      
      public Cursor fetchNamesByConstraint(String filter) {
      
        Cursor cursor=mDb.query(true, DATABASE_NAMES_TABLE, null,"row LIKE '%"+filter+"%' or name LIKE '%"+filter+"%'",null, null, null, null);
      
        }
      

      【讨论】:

      • 无参数绑定代码因SQL注入漏洞而变得不安全
      • 对不起,我听不懂。
      • 我将通过 filter = "criteria%'; DROP DATABASE .....; SELECT * FROM table WHERE row LIKE '%criteria"
      【解决方案4】:

      你应该给过滤器加上通配符;)

      "A%"
      

      【讨论】:

      • android.database.sqlite.SQLiteException: near "%": syntax error: , while compile: SELECT DISTINCT _id, nid, name FROM names WHERE name LIKE %?% 当我添加“喜欢?%"
      • 你需要用单引号包裹你的字符串
      【解决方案5】:

      您可以使用原始查询。

      public Cursor fetchNamesByConstraint(String filter) {
          String query = "SELECT * FROM " + TABLE_NAME + " WHERE " +
                          COLUMN_NAME + " LIKE '%" + filter + "%'" ;
          SQLiteDatabase db = this.getReadableDatabase();
          cursor = db.rawQuery(query, null);
          return mCursor;
      }
      

      【讨论】:

        【解决方案6】:
        public Cursor fetchNamesByConstraint(String filter) {
        
            mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
                    KEY_NAME }, KEY_NAME + " LIKE ?",
                    new String[] {"%"+ filter +"%"}, null, null, null,
                    null);
        
            return mCursor;
        }
        

        【讨论】:

          【解决方案7】:

          剩下的看我们的设计,光标基本相同

          public ArrayList<AboneDataList> getAllPasssiveAboneByDate(String mDate) {
              ArrayList<AboneDataList> foodList = new ArrayList<>();
              AboneDataList food;
              SQLiteDatabase database = dbHelper.getReadableDatabase();
              final String kolonlar[] = {DBHelper.COLUMN_A_ID,
                      DBHelper.COLUMN_A_ABONE_NO,
                      DBHelper.COLUMN_A_NAME,
                      DBHelper.COLUMN_A_IS_STUFF,
                      DBHelper.COLUMN_A_COUNTRY,
                      DBHelper.COLUMN_A_CITY,
                      DBHelper.COLUMN_A_TOWN,
                      DBHelper.COLUMN_A_ADDRESS,
                      DBHelper.COLUMN_A_PHONE,
                      DBHelper.COLUMN_A_MOBILE,
                      DBHelper.COLUMN_A_DATE_START,
                      DBHelper.COLUMN_A_DATE_END,
                      DBHelper.COLUMN_A_COUNT,
                      DBHelper.COLUMN_A_IS_ACTIVE,
                      DBHelper.COLUMN_A_CARGO,
                      DBHelper.COLUMN_A_YURT_ID,
                      DBHelper.COLUMN_A_JOURNAL,
                      DBHelper.COLUMN_A_MAIL,
                      DBHelper.COLUMN_A_BUSINESS,
                      DBHelper.COLUMN_A_BIRTH,
                      DBHelper.COLUMN_A_GENDER,
                      DBHelper.COLUMN_A_ABONE_TYPE,
                      DBHelper.COLUMN_A_MEDENI_TYPE};
          
              //String whereClause = DBHelper.COLUMN_A_JOURNAL + " = ? AND " + DBHelper.COLUMN_A_IS_ACTIVE + " = ? ";
              //final String whereArgs[] = {String.valueOf(mJournal),isActive};
          
              //Cursor cursor = database.query(DBHelper.TABLE_ABONE, kolonlar, whereClause, whereArgs,
                //      null, null, DBHelper.COLUMN_A_ID + " ASC");
          
              Cursor cursor = database.rawQuery("select * from " + DBHelper.TABLE_ABONE + " WHERE "
                                    + DBHelper.COLUMN_A_DATE_END + " LIKE '%" + mDate + "%'", null);
          
              //Cursor cursor = database.query(DBHelper.TABLE_ABONE, kolonlar, null, null, null, null, DBHelper.COLUMN_A_NAME + " ASC");
              while (cursor.moveToNext()) {
                  food = new AboneDataList();
                  food.setId(cursor.getInt(cursor.getColumnIndex(DBHelper.COLUMN_A_ID)));
                  food.setAbone_no(cursor.getInt(cursor.getColumnIndex(DBHelper.COLUMN_A_ABONE_NO)));
                  food.setName(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_NAME)));
                  food.setIs_stuff(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_IS_STUFF)));
                  food.setCountry(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_COUNTRY)));
                  food.setCity(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_CITY)));
                  food.setTown(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_TOWN)));
                  food.setAddress(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_ADDRESS)));
                  food.setPhone(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_PHONE)));
                  food.setMobile(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_MOBILE)));
                  food.setDate_start(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_DATE_START)));
                  food.setDate_end(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_DATE_END)));
                  food.setCount(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_COUNT)));
                  food.setIs_active(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_IS_ACTIVE)));
                  food.setCargo(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_CARGO)));
                  food.setYurt_id(cursor.getInt(cursor.getColumnIndex(DBHelper.COLUMN_A_YURT_ID)));
                  food.setJournal(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_JOURNAL)));
                  food.setMail(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_MAIL)));
                  food.setBusiness(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_BUSINESS)));
                  food.setBirth(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_BIRTH)));
                  food.setGender(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_GENDER)));
                  food.setAbone_type(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_ABONE_TYPE)));
                  food.setMedeni_hal(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_A_MEDENI_TYPE)));
                  foodList.add(food);
              }
              database.close();
              cursor.close();
              return foodList;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            • 1970-01-01
            • 2011-07-22
            • 1970-01-01
            • 2015-08-11
            • 2013-07-28
            相关资源
            最近更新 更多