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 的功能。请看下面我的回答。

4

3 回答 3

2

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

正确的查询是:

rawQuery("select * from " + DBTABLE_PROFILE + " where " + KEY_PROFILE_ID + "=?",
            new String[] { Integer.toString(profileID) });
于 2012-10-08T19:50:59.270 回答
0

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

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

前任:

 rawQuery(String.format("select * from %s where %s=%d",
                DBTABLE_PROFILE, KEY_PROFILE_ID, profileID));
于 2012-10-08T20:27:03.910 回答
0

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

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

于 2012-10-08T19:52:02.640 回答