2012-02-06 24 views
7

İçinde NSExpression Çekirdek Verileri İle Ayrıcalık Sayımı Şu anda Çekirdek Verilerini Kullanma. Bir tablo içinde ben bu satırlar boyunca bilgi almak için çalışıyorum vardır:NSFetchedResultsController

sonucu bu tür üretmek için
SELECT item, COUNT(*) FROM myTable GROUP BY item; 

:

+---------+------+-------+ 
| item  | COUNT(*) | 
+---------+------+-------+ 
| group 1  | 2  | 
| group 2  | 5  | 
| group 3  | 8  | 
+---------+------+-------+ 

Bir NSExpression kullanmak parlak fikri vardı Çekirdek Veriler sahip olmak umuduyla benim için tüm çalışmalarımı yapmak. Tekerleklerimi döndürmeye başlıyorum. sayımı: ifade işlevi üzerimde çöküyor. Istisna çok açık değil. toplam: gibi diğer ifade işlevlerinin kullanımı uygulamayı kilitlemez.

Sonuçları NSFetchedResultsController'da saklamak güzel olurdu. Diğer seçenekleri araştırdım, bunların hiçbiri çok çekici değil. Çekirdek Veriyi bu durumda bir SQL sarıcı olarak kullanmak yerine, bir SQL sorgusu yazmak ve onu ele geçirmek daha mantıklı olur mu?

Referans kaynak kodunuz için aşağıda.

cevap

14

İlk olarak "emailAddress" denilen bir özellik ile benim yapmacık örnekte ben bir varlık "Kişi" çağrısında önerdiği gibi bu NSExpression ile mümkündür almak için: Ben bu mükemmel öğretici izledi bisey icin saymak.

NSPropertyDescription *propDesc = [[[[model entitiesByName] objectForKey:@"Person"] propertiesByName] objectForKey:@"emailAddress"]; 
NSExpression *emailExpr = [NSExpression expressionForKeyPath:@"emailAddress"]; 
NSExpression *countExpr = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:emailExpr]]; 
NSExpressionDescription *exprDesc = [[NSExpressionDescription alloc] init]; 
[exprDesc setExpression:countExpr]; 
[exprDesc setExpressionResultType:NSInteger64AttributeType]; 
[exprDesc setName:@"count"]; 

NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 
[fr setPropertiesToGroupBy:[NSArray arrayWithObject:propDesc]]; 
[fr setPropertiesToFetch:[NSArray arrayWithObjects:propDesc, exprDesc, nil]]; 
[fr setResultType:NSDictionaryResultType]; 
NSArray *results = [moc executeFetchRequest:fr error:&error]; 

Ben 1000 kayıtlarla veritabanını önceden doldurmak için bir kod parçası yazdı:

NSArray *emailAddresses = [NSArray arrayWithObjects:@"[email protected]", @"[email protected]", @"[email protected]", @"[email protected]", @"[email protected]", nil]; 
    for (int i = 0; i < 1000; i++) { 
     NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:moc]; 
     [person setValue:[NSNumber numberWithInt:i] forKey:@"aNumber"]; 
     [person setValue:[[NSUUID UUID] UUIDString] forKey:@"aUUID"]; 
     [person setValue:[emailAddresses objectAtIndex:(i % [emailAddresses count])] forKey:@"emailAddress"]; 
    } 

, burada sonuç her e-posta adresini 200 kez ekler Yukarıdaki kod şunlardır:

2012-05-31 15:17:42.160 Scratch[16084:10d03] CoreData: sql: SELECT t0.ZEMAILADDRESS, COUNT(t0.ZEMAILADDRESS) FROM ZPERSON t0 GROUP BY t0.ZEMAILADDRESS 
2012-05-31 15:17:42.162 Scratch[16084:10d03] CoreData: annotation: sql connection fetch time: 0.0024s 
2012-05-31 15:17:42.163 Scratch[16084:10d03] CoreData: annotation: total fetch execution time: 0.0029s for 5 rows. 
(gdb) po results 
(NSArray *) $2 = 0x0f811280 <_PFArray 0xf811280>(
{ 
    count = 200; 
    emailAddress = "[email protected]"; 
}, 
{ 
    count = 200; 
    emailAddress = "[email protected]"; 
}, 
{ 
    count = 200; 
    emailAddress = "[email protected]"; 
}, 
{ 
    count = 200; 
    emailAddress = "[email protected]"; 
}, 
{ 
    count = 200; 
    emailAddress = "[email protected]"; 
} 
) 
+1

NSPropertyDescription'ı eksik görüyordum, bu da NSFetchRequest öğesinin "Group By item" satırını ekleyerek bir SQL Query olarak doğru şekilde yorumlanmasını sağladı. Bu nesnenin yayınlanma sırasında farkında değildim. Cevabını Şubat ayında geri alabilirdim ... lol. Gelecekte bu çözümü kullanmaya karar vermem durumunda, bunu bilmek güzel. Cevabınız takdir edildi. :-) –

+0

Bir not, orijinal yazar gruplama ile bir NSFetchedResultsController kullanarak bahsetti. Ne yazık ki 'setPropertiesToGroupBy' için çalışmanız gereken 'setResultType: NSDictionaryResultType' için izleme değişikliklerini devre dışı bırakmanız gerekiyor. Bkz. Http://stackoverflow.com/a/4361198/287403 –

+0

Hepsini saymak mümkün mü? – Andy

İlgili konular