2012-10-08 40 views
0

我有一个SQLite查询:表名可以替换为'?'

rawQuery("select * from ? where ?=?", new String[] { 
       DBTABLE_PROFILE, KEY_PROFILE_ID, Integer.toString(profileID) }); 

但是Android给了我

E/AndroidRuntime(7323): Caused by: android.database.sqlite.SQLiteException: 
near "?": syntax error (code 1): , while compiling: select * from ? where ?=? 

我测试它?造成了问题,结果是第一个。如果我将其更改为

"select * from profile where ?=?" 

它不是FC。

那么,表名可以代替'?'吗?

[编辑]:

有没有限制的变通实现rawQuery一样的功能。请参阅下面的答案。

回答

2

否。您应该用?代替的唯一参数是查询变量,而不是表名称而不是列名称。

正确的查询是:

rawQuery("select * from " + DBTABLE_PROFILE + " where " + KEY_PROFILE_ID + "=?", 
      new String[] { Integer.toString(profileID) }); 
+0

谢谢你的提示,我没有知道这些限制是在sqlite声明中强加的。 –

0

如果你测试过它,那么你就有答案了。

我不知道,但我相信这是因为rawQuery是不是做字符串拼接幕后 - 这将准备一个存储过程或类似的,然后逃离值到程序对象。因此,它需要知道表名以创建过程,所以不能使用表名替换。

0

感谢Sam的指针,由于限制的次数,我发现自己甚至使用rawQuery(String,String [])也非常愚蠢。

IMO实现rawQuery样functionlaity没有限制的最好的办法就是用的String.format()使用rawQuery(字符串)

例如:

rawQuery(String.format("select * from %s where %s=%d", 
       DBTABLE_PROFILE, KEY_PROFILE_ID, profileID));