2013-08-06 4 views
5

Ich arbeite mit SQLite auf Android.
Ich verwendete ContentProvider, um Daten von db abzufragen. Und jetzt habe ich ein Problem, wenn versuchen, Unterabfrage zu verwenden, über ContentResolverselectionArgs in ContentResolver.query (...) kann eine Unterabfrage sein?

String selection = "cat_id NOT IN ?" 
String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"} 
cursor = mResolver.query(getContentUri(), getListColumns(), 
        selection, selectionArgs, orderBy); 

Und das ist der Fehler: „Kann ich selectionArgs verwenden eine Subquery sein“

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` 

Meine Frage ist,
Mein Zweck ist "Holen Sie sich die Liste der Transaktionen, wo Cat_id ist nicht in einer Kategorie Tabelle".
Wer kann mir helfen?

Antwort

11

Vergessen Sie nicht das hier? ist eigentlich ein Platzhalter für einen Wert. Das wird später von Android gebunden werden.

Als solche würden Sie keine Abfrage durch ersetzt werden?. Als den Punkt der Verwendung der? soll sicherstellen, dass SQL-Code nicht durch Benutzerparameter injiziert wird.

String selection = "cat_id NOT IN ?" 
String[] selectionArgs = new String[]{"(SELECT Categories.id FROM Categories)"} 
cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 

Ist equilivant Ihnen so etwas wie

String selection = "cat_id NOT IN '(SELECT Categories.id FROM Categories)'" 

Schreiben Wenn die Abfrage, die Sie ausführen möchten, ist tatsächlich, obwohl der als Wert, was bedeutet, dass NOT IN '(some value)' nicht gültige SQL ist.

Ich schlage vor, dass Sie nur die entfernen? und ersetzen Sie es durch die Abfrage, die Sie in Ihren Wo-Argumenten haben, die es beheben werden.

Sie würden die verwenden? Platzhalter wie diese (wenn Sie wüssten, wo es nicht sein muss).

String selection = "cat_id NOT IN (?, ?)" 
String[] selectionArgs = new String[]{"value1", "value2"} 
cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 

Edit: Versuchen

String selection = "cat_id NOT IN (SELECT Categories.id FROM Categories)" 
cursor = mResolver.query(getContentUri(), getListColumns(), selection, null, orderBy); 
+0

Vielen Dank für Ihre Antwort so viel. Ich kann nicht genau die Elemente NICHT IN (?,? ...) definieren. Ich denke, die SQL-Abfrage "Select * from TRANSACTIONS wo cat_id NICHT IN (Wählen Sie KATEGORIEN.id aus KATEGORIEN)" ist Okay. Aber ich weiß nicht, wie man diese Abfrage mit ContentResolver macht? – NamLe

+0

haben Sie versucht, die? und haben Sie einfach den vollen Code drin? Sie möchten dann auch Null für die selectionArgs übergeben – Nicholas

+0

Siehe bearbeiten, hoffentlich funktioniert das für was Sie wollen. – Nicholas

2

Ich gebe Ihnen ein Beispiel, das (in Update ContentResolver Methode in meinem Fall) funktionieren soll:

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