2010-01-28 15 views
31

Kullanıcı iletişim bilgilerini almak ve sonra bir tür normal ifade eklemek ve bunları bir liste görünümüne eklemek istiyorum. Şu andaAndroid'de içerik çözümleyici sonuçları nasıl filtrelenir?

getContentResolver().query(People.CONTENT_URI, null, null, null, null);

aracılığıyla tüm kişileri almak ve sonra SimpleCursorAdapter uzanan özel bir sınıfa onları geçmek mümkün duyuyorum.

Bu nedenle, yalnızca normal bir ifadeyle eşleşen kişileri ve yalnızca tüm kişilerin bağlantılarını nasıl alacağımı öğrenmek istiyorum.

cevap

63

yerine

getContentResolver().query(People.CONTENT_URI, null, null, null, null); 

nedeniyle, bu birleştirme önler ve Temel olarak kullanıcıdan süzgeç talep ediyorsanız SQL enjeksiyonunu engeller. Örneğin siz dizeleri bitiştirmek vardır

name = "Donald Duck' OR name = 'Mickey Mouse") // notice the " and ' 

eğer

cursor = resolver.query(People.CONTENT_URI, projection, 
    People.NAME + " = '" + name + "'", 
    new String[] { sa1 }, null); 

hayal kullanıyorsanız.

+0

Yanıtlarınız için teşekkürler, gerçekten takdir ediyorum. – maxsap

+2

Çok güzel bir açıklama, çok teşekkürler! –

5

İçerik sağlayıcısı, sql türü girdisi ile sorgulayabilir, Sorgu yöntemi yalnızca bir sql komutu için bir sarıcıdır. İşte

yerine null ben sql deyimi oluşturmak parametreleri var

String [] requestedColumns = { 
      Contacts.Phones.NAME, 
      Contacts.Phones.TYPE 
    }; 

Cursor contacts = context.getContentResolver().query(
      Contacts.Phones.CONTENT_URI, 
      requestedColumns, 
      Contacts.Phones.NUMBER + "='" + phoneNumber + "'", 
      null, null); 

Not belirli sayıda verilen İletişim isim sorgulamak bir örnektir.

requestColumns geri almak istiyorum ve Contacts.Phones.NUMBER + "= '" + phoneNumber + "'" Nereye maddesi olan veri, bu yüzden Telefon Numarası

maçları Adı ve Tipi almak
3

LINK dahil olmak üzere, query() yönteminin üçüncü bağımsız değişkeni olarak yasal bir SQLite WHERE yan tümcesi koyabiliyor olmanız gerekir, ancak SQLite ve Android'de yerel REGEXP işlevi, kendi tanımlamanıza izin vermiyor gibi görünmüyor. Dolayısıyla, ihtiyaçlarınızın ne kadar karmaşık olduğuna bağlı olarak, bir dizi diğer SQLite koşulları ve LIKE ifadeleri de hile yapabilir.

ContentResolver ve SQLite expressions öğesinin altındaki query method belgesindeki belgelere bakın. Bunu (?kullanarak) parametreli isteği kullanır

final ContentResolver resolver = getContentResolver(); 
final String[] projection = { People._ID, People.NAME, People.NUMBER }; 
final String sa1 = "%A%"; // contains an "A" 
cursor = resolver.query(People.CONTENT_URI, projection, People.NAME + " LIKE ?", 
    new String[] { sa1 }, null); 

gibi bir şey kullanmak ve farklı bir argüman olarak gerçek değerleri sağlar gerektiğini

1

Calllog İçerik Sağlayıcısı olan REGEXP aslında çalışıyor (bu içerik sağlayıcının Veritabanı https://sqlite.org/lang_expr.html#regexp için regexp() işlevinin tanımlandığı anlamına gelir)! Ama çok yavaş: ~ 1750 kayıtlarında ~ 15 sn.

String regexp = "([\\s\\S]{0,}" + 
TextUtils.join("||[\\s\\S]{0,}", numbers) + 
")"; 

cursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, 
null, 
CallLog.Calls.NUMBER + " REGEXP ?", 
new String[]{regexp}, 
CallLog.Calls.DATE + " DESC" 
); 
İlgili konular