SQL查询Android问题的条款

eas*_*ese 6 java sqlite android

我有以下代码创建我的表.我将数据插入其中,看起来像这样

_id     date     recordName     total
--------------------------------------
7      2011     TestMaxRecord     5
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

每当name ="TestMaxRecord"(尽管有数据存在)时它会引发异常并出现以下错误

android.database.sqlite.SQLiteException:没有这样的列:TestMaxRecord :,编译时:SELECT DISTINCT _id,date,recordName,total FROM Records WHERE recordName = TestMaxRecord

在我看来,它正在寻找一个列标题TestMaxRecord.我是一个Android新手,但几乎完全从一个例子复制了这部分(虽然它使用的是int).在查询中使用int和Strings之间有区别吗?

The*_*ter 11

您需要在值周围放置单引号,否则它会将其视为列.

KEY_RECORD_NAME + " = '" + name + "'"
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案对Sql Injection是开放的,您应该使用参数占位符,并通过参数传递值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);
}
Run Code Online (Sandbox Code Playgroud)

或者,看看 SQLiteQueryBuilder