5

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 が Category テーブルにないトランザクションのリストを取得する」ことです。
誰が私を助けることができます?

4

2 に答える 2

12

ここで忘れないでください ? 実際には値のプレースホルダーです。これは後でアンドロイドによってバインドされます。

そのため、クエリを ? に置き換えることはありません。? を使用するポイントとして 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);
于 2013-08-06T02:01:03.307 に答える
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],
};
于 2013-12-18T11:55:59.913 に答える