表名可以用'?'代替

时间:2012-10-08 19:44:31

标签: android sqlite

我有一个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的功能,没有任何限制。请参阅下面的答案。

3 个答案:

答案 0 :(得分:2)

没有。您应该用?替换的唯一参数是查询变量,而不是表名而不是列名。

正确的查询是:

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

答案 1 :(得分:0)

如果您已经测试过,那么您就得到了答案。

我不确定,但我希望是因为 rawQuery 不在幕后进行字符串连接 - 它将准备一个存储过程或类似的,然后将值转义为程序对象。因此,它需要知道表名来创建过程,因此不能使用替换表名。

答案 2 :(得分:0)

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

IMO在没有限制的情况下实现类似rawQuery的功能的最佳方法是使用带有String.format()的rawQuery(String)

例如:

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