2011-05-14 15 views
28

Bazı koşulların bir NSPredicate dosyasına nasıl “nasıl basamaklandırılacağı” konusunda emin değilim.Bir NSPredicate öğesinin birden çok koşulla yapılandırılması

Oldukça Çekirdek Verilere yeni ve yapmam ne arıyorum ulaşmak için doğru yol olup olmadığından emin değilim. İşte

ben yapmaya çalışıyorum ne:

photosTookThere bir tersini olan bir Nesnenin yeri, bir whereTook ilişkisi olan bir Photo nesne yoktur. sırayla

Of Fotoğraf isFavourite adlı bir NSNumber niteliği vardır.

Ben ilk photosTookThere var olduğundan ve eğer öyleyse, her çıkan Foto nesnesini kontrol edip favori olarak ayarlanır sadece olanları dönecektir bir NSFetchRequest yapılandırmak istiyorum. İşte

bugüne kadar kodudur:

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context]; 
request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] != 0"]; 

nasıl yüklem içine ikinci koşulu basamakla ve doğru sonuçları dönecekti? Bir SQL deyiminde bir "nerede" koşulunu belirten olsaydı

cevap

61

Sadece parantez içinde her koşul koymak ve bunları bağlamak VE.

[NSPredicate predicateWithFormat:@"([email protected] != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]]; 

Ben de "konum" için "whereTook" ilişkinin adını değiştirerek tavsiye ederim ve "photosTookThere" basitçe "fotoğraflar", o sözleşme doğrultusunda daha fazla.

request.predicate = [NSPredicate predicateWithFormat: 
         @"([email protected] !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1)[email protected] >0" 
         ]; 
+0

Teşekkürler, geleceğe yönelik konvansiyonlar hakkında yorum yapacağım - Çekirdek Veriler için yeniyim. Hala olsa bir sorun yaşıyorum: 2011-05-15 17: 52: 24.346 CL Yerler [14321: 207] *** Yakalama dışı istisna 'NSInvalidArgumentException' nedeniyle neden sona erdirme, nedeni: 'keypath isFavourite değil varlık bulundu ' Ben isFavourite Fotoğraf nesnesi değil Yer üstünde tutar olduğundan tahmin ediyorum. photosTookThere bir NSSet'dir. Bunun bir NSSet olduğunu ve her grubun üyesineFavourite'ın kontrol edilmesi gerektiğini nasıl anlarım? – Will

+0

Anladım. Evet sorun şu ki bir argüman konumlar ve diğeri fotoğraflar içindir. Bence ilişkilerin isimlendirilmesi beni mahvediyor. Seni doğru anlarsam, o zaman fotoğraflar için çekeceksin, böylece NSEntityDescription'ın bunu yansıtması gerekir. Yapmak istediğiniz şey, sizin için sorguladığınız konum nesnesine sahip olmaktır. Daha sonra yüklemeyi @ "(neredeTook ==% @) AND (isFavourite ==% @)", [self location], [NSNumber numberWithBool: YES] olarak değiştirirsiniz. Konum nesnesine sahip olduğunuz yerde [self location] ile değiştirilir. Bu yardımcı olur umarım. –

+0

Teşekkürler; Hala biraz rahatsız edici olmakla birlikte, gerçekten bariz bir şeyi kaçırdığımda ek bir arkaplan okuması yapacağım.İlişkileri yeniden isimlendirebilirim, bu yüzden ben de bu sırada uygun sözleşmelere uyuyorlar. – Will

6

Çok basitçe kadar yaptığınız gibi AND ve OR yüklemi kullanabilirsiniz. "WhereTook" ile karşılaştırırken istediğiniz gibi görünen bir NULL'u kontrol etmek için, nil ile karşılaştırabilirsiniz (whereTook = nil).

+0

sen (whereTook == nil) demek: – katzenhut

+1

@katzenhut Tek bir '' '' '' '' yüklemler/SQLite için geçerli bir koşuldur. –

8

Sonunda bir alt sorgu kullanarak bu çözmek başardı. aksi halde onun bir görevidir.
İlgili konular