2014-09-05 42 views
1

我创建了一个表叫CHEMISTID搜索字符串:的Android的SQLite rawQuery与WHERE子句返回的行中找不到

private static final String CREATE_TABLE_CHEMISTID = "CREATE TABLE " 
     + CHEMISTID + "(" + KEY_ID + " INTEGER PRIMARY KEY, " + KEY_CHEMISTID 
     + " TEXT" + ")"; 

我插入功能工作正常,但是当我运行一个搜索查询发现,如果chemistId已经目前使用下面的查询语句:

String selectQuery = "SELECT * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = "+ chemistID + ";"; 

Cursor c = db.rawQuery(selectQuery,null); 

我的logcat显示以下错误消息:

E/AndroidRuntime(1169): FATAL EXCEPTION: main 
E/AndroidRuntime(1169): android.database.sqlite.SQLiteException: no such column: Spain (code 1): , while compiling: SELECT * FROM chemistIdTable WHERE chemistId = Spain; 

西班牙是一个特殊的化学家,我是在我的程序中动态创建的。

我该如何修复selectQuery字符串,以便在列名KEY_CHEMISTID中搜索特定字符串chemistId?

回答

4

您需要在SQL中引用您的字符串,例如Spain,以便将它们视为字符串文字而不是列名称标识符。你可以使用单引号,如'Spain'

然而,更好的做法是使用?参数占位符代替,并选择args数组中提供的参数值,如:

... KEY_CHEMISTID + "=?" ... 

c = db.rawQuery(selectQuery, new String[] { chemistID }); 
+0

非常感谢我不仅向我展示了正确答案,而且让我了解了背后的逻辑。为了使用子查询对复杂查询实现相同的逻辑,我应该将其分割成不同的查询字符串吗? 字符串selectQuery = “SELECT * FROM” + DATE + “WHERE” + KEY_ID + “= '(SELECT ”+ KEY_DATE_ID \t \t +“ FROM ”+ CHEMISTID_DATE_ORDERNUMBER_ORDERDATA + “ WHERE ”+ KEY_CHEMISTID_ID +“='(SELECT” + KEY_ID +“FROM”+ CHEMISTID +“WHERE”+ KEY_CHEMISTID +“=”+ chemistId +“)')'AND”+ KEY_DATE +“='”+ date +“'”; – 2014-09-05 11:07:07

+0

查询字符串中可以有多个'?'。只需在选择参数数组中提供相等数量的值。 – laalto 2014-09-05 11:09:14

+0

这是否是正确的解决方案? (SELECT)+ KEY_ID +“FROM”+ CHEMISTID_DATE_ORDERNUMBER_ORDERDATA +“WHERE”+ KEY_CHEMISTID_ID +“=(SELECT”+ KEY_ID +“FROM “+ CHEMISTID +”WHERE“+ KEY_CHEMISTID +”=?“+”))AND“+ KEY_DATE +”=?“; Log.e(LOG,selectQuery); SQLiteDatabase db = this.getReadableDatabase(); Cursor c = db.rawQuery(selectQuery,new String [] {chemistId,date});' – 2014-09-05 11:21:09

1

你错过了单引号,所以改变

String selectQuery = "SELECT * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = "+ chemistID + ";"; 

String selectQuery = "SELECT * FROM " + CHEMISTID +" WHERE " + KEY_CHEMISTID + " = '"+ chemistID + "';"; 

推荐的解决方案是使用参数化查询作为

Cursor c = db.query(CHEMISTID, null, KEY_CHEMISTID + "=?", 
      new String[] { chemistID },null, null, null, null); 
+0

非常感谢解决方案!我意识到这个错误,现在它可以工作。但是,如果我使用参数化查询,并且如果其中一个参数失败,它会使我的输入应用程序崩溃。后来在我的应用程序中,我还使用了几个复杂的子查询,这对于在参数化查询中使用并不理想 – 2014-09-05 11:02:27