有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SQL查询Android Where子句的java问题

下面的代码创建了我的表。我在其中插入了如下数据

_id     date     recordName     total
--------------------------------------
7      2011     TestMaxRecord     5

Java代码:

public static final String KEY_ROWID = "_id";   
public static final String KEY_DATE = "date";
public static final String KEY_TOTAL = "total";
public static final String KEY_RECORD_NAME = "recordName";

private static final String DATABASE_CREATE_RECORDS = "create table " + DATABASE_TABLE_RECORDS + " (" 
+ KEY_ROWID + " integer primary key autoincrement, " 
+ KEY_DATE + " text not null, "
+ KEY_RECORD_NAME + " text not null, "
+ KEY_TOTAL + " text not null);";

public Cursor getRecord(String name) throws SQLException {
  return mDb.query(true, DATABASE_TABLE_RECORDS, new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, KEY_RECORD_NAME + " = " + name, null, null, null, null, null);
}

每当name=“TestMaxRecord”(尽管其中有数据)出现以下错误时,它都会抛出一个异常

安卓.database.sqlite.SQLiteException: no such column: TestMaxRecord: , while compiling: SELECT DISTINCT _id, date, recordName, total FROM Records WHERE recordName=TestMaxRecord

在我看来,它正在寻找一个专栏标题TestMaxRecord。我是一个安卓新手,但这部分内容几乎完全是从一个示例中复制的(不过它使用的是int)。在查询中使用int和string有区别吗


共 (1) 个答案

  1. # 1 楼答案

    您需要在该值周围加上单引号,否则它会将其视为一列

    KEY_RECORD_NAME + " = '" + name + "'"
    

    注意:此解决方案对Sql注入开放,您应该使用参数占位符,并通过selectionArgs参数传递值:

    public Cursor getRecord(String name) throws SQLException {
      return mDb.query(true, 
        DATABASE_TABLE_RECORDS, 
        new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, 
        KEY_RECORD_NAME + " = ?",
        new String[] {name},
        null, null, null, null);
    }
    

    或者,看看^{}