2013-08-06 14 views
5

Pracuję z SQLite na Androida.
Użyłem ContentProvider do zapytania danych z db. I teraz mam problem, gdy spróbuje użyć podzapytania poprzez ContentResolverselectionArgs w ContentResolver.query (...) może być podzapytaniem?

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

I to jest błąd: „Czy mogę używać selectionArgs być podkwerendzie”

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` 

Moje pytanie brzmi:
Moim celem jest "uzyskać listę transakcji, w których cat_id NIE jest w tabeli kategorii".
Kto może mi pomóc?

Odpowiedz

11

Nie zapomnij o tym? jest w rzeczywistości symbolem zastępczym dla wartości. Które będą wiązane później przez Androida.

Jako takie, nie chcesz, aby zapytanie zostało zastąpione przez?. Jako punkt korzystania z? jest zapewnienie, że kod SQL nie jest wstrzykiwany przez parametry użytkownika.

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

Czy equilivant do piszesz coś

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

Jeżeli kwerenda chcesz prowadzony jest rzeczywiście choć jako wartość, co oznacza, że ​​ NOT IN '(some value)' jest nieprawidłowy SQL.

Proponuję po prostu usunąć? i zamień go na zapytanie, które masz w argumentach where, które naprawi.

Można użyć? takie symbole zastępcze (jeśli wiesz, w czym nie musi być).

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

Edit: Spróbuj

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

Dzięki bardzo za odpowiedź. Nie mogę dokładnie zdefiniować przedmiotów NIE (?,? ...). Myślę, że kwerenda sql "Wybierz * z TRANSACTIONS gdzie cat_id NIE (Wybierz CATEGORIES.id z KATEGORII)" jest OK. Ale nie wiem jak zrobić to zapytanie za pomocą ContentResolver? – NamLe

+0

Czy próbowałeś usunąć? i mam tam tylko pełny kod? również chcesz przekazać wartość zerową do wyboruArgs – Nicholas

+0

Zobacz edytuj, mam nadzieję, że działa to, co chcesz. – Nicholas

2

dam wam przykład, który powinien działać (w zaktualizowanej metody ContentResolver w moim przypadku):

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], 
}; 
Powiązane problemy