2010-10-18 17 views
33

Nesnelerin özelliklerini NSDictionaryResultType içinde döndüren bir NSFetchRequest sahibim. Bu sözlükteki ObjectId nesnelerini de almak mümkün mü? Aksi halde, çok sayıda iade edilen öğe için çok daha yavaş olan NSManagedObjectResultType türünde bir dönüş türüyle sorguyu çalıştırmam gerekecek.Çekirdek verileri, NSFetchRequest NSDictionaryResultType döndürdüğünde NSManagedObject ObjectId nasıl edinilir?

[fetchRequest setReturnsObjectsAsFaults:YES]; 
[fetchRequest setPropertiesToFetch:nil]; 
[fetchRequest setFetchLimit:1]; 
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed 
[request setResultType:NSManagedObjectIDResultType]; 

Bu neden olur ile ilgili bir dizi dönüş talebi almak:

cevap

76

Evet, çok şık ancak hatalı belgelenmiş NSExpressionDescription sınıfını kullanarak yapabilirsiniz. NSFetchRequest için nesnesini nesnesini setPropertiesToFetch: aracılığıyla ayarladığınız NSPropertyDescription nesnesine eklemeniz gerekir. Örneğin

:

NSExpressionDescription* objectIdDesc = [[NSExpressionDescription new] autorelease]; 
objectIdDesc.name = @"objectID"; 
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject]; 
objectIdDesc.expressionResultType = NSObjectIDAttributeType; 

myFetchRequest.propertiesToFetch = [NSArray arrayWithObjects:objectIdDesc, anotherPropertyDesc, yetAnotherPropertyDesc, nil]; 
NSArray* fetchResults = [myContext executeFetchRequest:myFetchRequest error:&fetchError]; 

Daha sonra geri getirme isteğinden olsun sözlüklerde bir @"objectID" anahtara sahip olmalıdır. Getirilen sonuçları bir diziye zaten bu yana

+2

Güzel yok ve örnek belgeleyen çok takdir çünkü ben yorum yapamam

let idDescription = NSExpressionDescription() idDescription.name = "objectID" idDescription.expression = NSExpression.expressionForEvaluatedObject() idDescription.expressionResultType = .objectIDAttributeType 

+1

Bu yılın garip bir cevabıdır :) –

0

şimdiye kadar talep almak ikinci yürütürken bulduk tek çözümü, bu, aşağıdaki farklar haricinde isteği almak, ilk benzer tam olarak bir nesne, istenen objectID. İlk getirme isteğinin sonucu 10000 nesne içerdiğinde bile performans iyi görünüyor.

Bunu işlemek için daha iyi yollar varsa, birileri onları buraya gönderebilirse memnun olurum.

4
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    request.entity = [NSEntityDescription entityForName:@"yourEntity" inManagedObjectContext:context]; 
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES], nil]; 
    request.predicate = nil; 
    request.fetchLimit = 20; 

    NSError *error = nil; 
    NSArray fetchedResults = [context executeFetchRequest:request error:&error]; 

    NSLog(@"%@", [fetchedResults valueForKey:@"objectID"]); 

neden valueForKey onları çekip: "objectId" @? Temiz, basit sadece bir getirme isteğine ihtiyaç duyar, böylece ihtiyacınız olan tüm diğer verileri de çekebilirsiniz.

+1

Jason, sözlük biçiminde sonuç almak isterken, yaklaşımınız hatalı yönetilen bir nesne döndürür – unixo

0

Swift Nick Hutchinson cevap: Nick'i bulmak yeterli temsilcisi :(

İlgili konular