2013-08-06 11 views
5

Android'de SQLite ile çalışıyorum.
Db'den veri sorgulamak için ContentProvider kullanıyorum. Ve şimdi, deneyin ContentResolverselectionArgs bir alt sorgu olabilir?

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

aracılığıyla alt sorgu kullanmak için bir sorun var Ve bu hatadır: "Ben selectionArgs kullanabilir miyim bir alt sorgunun olmak"

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` 

Benim sorum
Amacım "cat_id'in bir Kategori tablosunda OLMADIĞI işlemlerin listesini al".
Bana kim yardımcı olabilir?

cevap

11

Burada bunu unutma? aslında bir değer için bir yer tutucudur. Hangi android tarafından daha sonra bağlanacaktır.

Bu şekilde, değiştirilmek üzere bir sorgu koymak istemezsiniz. Kullanım noktası olarak? sql kodunun kullanıcı parametreleri tarafından enjekte edilmediğinden emin olmaktır.

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

Eğer

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

gibi bir şey yazmaya equilivant Nerede sorgu çalıştırma aslında NOT IN '(some value)' geçerli sql değil, yani bir değer olarak bir olsa ediliyor istiyorum.

Sadece kaldırmayı öneririm? ve bunu düzeltecek argümanlarınızda bulunan sorgu ile değiştirin.

Kullanmak ister misiniz? yer tutucuları böyle olsaydı (ne olması gerektiğini bilmiyorsanız).

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

Düzenleme: Sana (benim durumumda güncelleme ContentResolver yönteminde) çalışması gerektiğini bir örnek vermek

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

teşekkürler. Tam olarak NOT IN (?,? ...) öğelerini tanımlayamıyorum. Ben sql sorgusu "select * CATCORIES IN CATEGORIES.id seçin CAT_ID DEĞİLDİR. Ancak, bu sorguyu ContentResolver kullanarak nasıl yapacağımı bilmiyorum? – NamLe

+0

kaldırmayı denediniz mi? ve tam kodunuz var mı? Ayrıca seçiminiz için null geçmek istiyorumArgs – Nicholas

+0

Düzenleme bakın, umarım bu ne istediğiniz için çalışır. – Nicholas

2

deneyin: Cevabınız için çok

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