我在Android上使用SQLite。
我使用ContentProvider
来查询db中的数据。
现在,尝试通过ContentResolver
String selection = "cat_id NOT IN ?"
String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"}
cursor = mResolver.query(getContentUri(), getListColumns(),
selection, selectionArgs, orderBy);
这就是错误:
08-06 10:32:36.070: E/AndroidRuntime(2151): Caused by: android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: SELECT * FROM TRANSACTIONS WHERE cat_id NOT IN ? ORDER BY time_created ASC, id ASC`
我的问题是“我可以使用selectionArgs作为子查询吗?”
我的目的是“获取cat_id不在类别表中的事务列表”。
谁能帮帮我?
答案 0 :(得分:11)
这里别忘了?实际上是一个值的占位符。以后将由android绑定。
因此,您不会将查询替换为?。作为使用点?是为了确保用户参数不会注入sql代码。
String selection = "cat_id NOT IN ?"
String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"}
cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy);
与你写
之类的东西是否相等String selection = "cat_id NOT IN '(SELECT Categories.id FROM Categories)'"
你想要运行的查询实际上是作为一个值,这意味着
NOT IN '(some value)'
无效sql。
我建议你删除?并将其替换为您将修复它的where参数中的查询。
你会用的吗?像这样的占位符(如果你知道它不必是什么)。String selection = "cat_id NOT IN (?, ?)"
String[] selectionArgs = new String[]{"value1", "value2"}
cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy);
修改:尝试
String selection = "cat_id NOT IN (SELECT Categories.id FROM Categories)"
cursor = mResolver.query(getContentUri(), getListColumns(), selection, null, orderBy);
答案 1 :(得分:2)
我给你一个应该有效的例子(在我的情况下更新ContentResolver方法):
String selection = DatabaseContract.EventTable.Column.ID_EVENT + " IN (SELECT DISTINCT "
+ DatabaseContract.CountryEventTable.Column.EVENT_ID + " FROM "
+ DatabaseContract.CountryEventTable.TABLE_NAME + " WHERE "
+ DatabaseContract.CountryEventTable.Column.COUNTRY_CODE + "=?)";
String [] selectionArgs = new String[]{
data[0],
};