【问题标题】:Android SQLite NOT LIKE syntaxAndroid SQLite NOT LIKE 语法
【发布时间】:2020-09-01 21:47:42
【问题描述】:

我想从数据库中选择与名称不匹配的名称,该名称已存在。 使用此代码,抛出错误:No such table

public String getRandomAnswer(String correctName){
     String randomAnswer;
     mDbHelper.initializeDataBase();
     try {
         mDb = mDbHelper.getWritableDatabase();
         String sql = "SELECT Name FROM Cities WHERE Name NOT LIKE " + correctName + " ORDER BY Random() LIMIT 1 ";
         Cursor c = mDb.rawQuery(sql, null);
         if (c != null) {
             if (c.moveToFirst()) {
                 randomAnswer = c.getString(c.getColumnIndex("Name"));
                 return randomAnswer;
             }
             c.close();
         }
     } catch (Exception ex) {
         ex.printStackTrace();
     } finally {
         try {
             mDbHelper.close();
         } catch (Exception ex) {
             ex.printStackTrace();
         } finally {
             mDb.close();
         }
     }
     return null;
 }

但如果我直接输入String sql = "SELECT Name FROM Cities WHERE Name NOT LIKE 'someOtherName' ORDER BY Random() LIMIT 1 "; 比它的作品,但它不是我想要的。

【问题讨论】:

  • 对查询中的值使用参数而不是字符串连接。
  • @stickybit 如果我理解正确:Cursor c = mDb.query("Cities", new String[] {"Name"},"Name NOT LIKE ?", new String[]{correctName}, null, null, "Random()", String.valueOf(1));

标签: java sql sqlite android-studio syntax


【解决方案1】:

考虑 SQL 参数化而不是字符串连接,因为您需要将变量括在单引号中。否则,引擎会假定您引用了列或表标识符。 rawQuery 方法支持参数。此外,不带通配符的LIKE 应使用相等性,=。但如果需要通配符,请附加到参数。

// PREPARED STATEMENT WITH QMARKS, ?
String sql = "SELECT Name FROM Cities WHERE Name NOT LIKE ? ORDER BY Random() LIMIT 1 ";

// QUERY EXECUTION WITH BINDED VALUE AND WILDCARDS
Cursor c = mDb.rawQuery(sql, new String[]{ "%"+correctName+"%" });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多