ContentResolver.query(...)中的selectionArgs可以是子查询吗?

时间:2013-08-06 01:42:01

标签: android sqlite android-contentprovider

我在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不在类别表中的事务列表”。
谁能帮帮我?

2 个答案:

答案 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],
};