2011-05-31 21 views
21

Belirli bir kümede olmayan çekirdek verilerden nesneleri almaya çalışıyorum, ancak çalışmaya başlayamadım. Örneğin, kullanıcı adı, kullanıcıAdı, aileAdı, verilenAdı ve etkin gibi birkaç özniteliği olan Kullanıcı adında temel bir veri varlığımız olduğunu varsayalım. adlarının bir dizi temsil dizelerden oluşan bir dizi göz önüne alındığında, kolayca kullanıcı adları bu listeye karşı gelen tüm kullanıcılar getirebilir:Kümedeki çekirdek verilerden nesne getirme

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" 
              inManagedObjectContext:moc]; 
[request setEntity:entity]; 

NSArray *userNames = [NSArray arrayWithObjects:@"user1", @"user2", @"user3", nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName IN %@", userNames]; 
[request setPredicate:predicate]; 
NSArray *users = [moc executeFetchRequest:request error:nil]; 

Ancak, yani o setin tamamlayıcı getirmesini istediğiniz, tek istediğim userNames dizisinde belirtilen kullanıcı adlarına sahip olmayan çekirdek verilerdeki kullanıcılar. Bu konuya nasıl yaklaşılacağı konusunda bir fikri olan var mı? "NOT" yüklemenin (i.e., "userName NOT IN %@") yüklemesine eklenebilecek kadar basit olacağını düşündüm, ancak Xcode, yüklem biçiminin ayrıştırılamadığını söyleyen bir istisna atar. Ayrıca şans getirmeden istekleri almak için kullanılabilecek yüklemeyi kurmayı denedim. Dokümantasyon da özellikle yararlı değildi. Öneriler? Yorumlar? Hepsinden bir istek dönmelidir

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (userName IN %@)", userNames]; 

: Yardımın için teşekkürler :) sizin dizideki olmayan nesneleri bulmak için

cevap

52

için yapmanız gereken tek şey böyle bir şeydir belirtmediğiniz nesneler

+0

Yeterince basit ... Teşekkürler, slev. – tomas

+0

harika. Çalışmıyordum diye düşündüm. Ama bu benim dizideki verilerin başka bir alandan olmasıydı. Teşekkürler. Basit ve etkili. –

+0

Not: Bu, NSNumber değişkenleri ile çalışmaz, muhtemelen bir anlam ifade eder, ancak bir NSN sayısında bir enum eklediğinizde utanç vericidir. Bu durumda, [NSPredicate predicateWithFormat: @ "NOT (enumWrapper IN {% d,% d})", enum1, enum2] 'gibi bir şey kullanın. –

1

Temel verilerde/objektif-c'de güçlüyüm, ancak yüklem aşağıdaki gibi olmalıdır;

[predicateFormat appendFormat:@"not (some_field_name in {'A','B','B','C'})"]; 

Bir örnek:

NSMutableString * mutableStr = [[NSMutableString alloc] init]; 

//prepare filter statement 
for (SomeEntity * e in self.someArray) { 
    [mutableStr appendFormat:@"'%@',", e.key]; 
} 

//excluded objects exist 
if (![mutableStr isEqual:@""]) 
{ 
    //remove last comma from mutable string 
    mutableStr = [[mutableStr substringToIndex:mutableStr.length-1] copy]; 

    [predicateFormat appendFormat:@"not (key in {%@})", mutableStr]; 
} 

//... 
//use this predicate in NSFetchRequest 
//fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateFormat]; 
//... 
0

İşte dizeleri listesini almak ve filtrelemek için nasıl harfinin YAPMAYIN hangi herhangi AZ gösteren başka yararlı bir örnek verilmiştir:

NSArray* listOfCompanies = [NSArray arrayWithObjects:@"123 Hello", @"-30'c in Norway", @"ABC Ltd", @"British Rail", @"Daily Mail" @"Zylophones Inc.", nil]; 

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF MATCHES[c] '^[A-Za-z].*')"]; 

NSArray *filteredList = [listOfCompanies filteredArrayUsingPredicate:bPredicate]; 

for (NSString* oneCompany in filteredList) 
    NSLog(@"%@", oneCompany); 

UITableView'u AZ dizini ile doldurduğumda bu tür NSPredicate kullanıyorum ve bir harfle başlamayan öğeler için "diğer her şey" bölümünü istiyorum.

İlgili konular