2010-10-18 3 views

Répondre

76

Oui, vous pouvez, en utilisant la classe NSExpressionDescription très chouette mais mal documentée. Vous devez ajouter un objet NSExpressionDescription correctement configuré au tableau des objets NSPropertyDescription que vous définissez via setPropertiesToFetch: pour votre NSFetchRequest.

Par exemple:

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]; 

Vous devriez alors avoir une @"objectID" clé dans les dictionnaires que vous revenez de votre demande d'extraction.

+2

Nice trouver Nick, et votre documentation l'exemple a été très apprécié –

+1

Ceci est une réponse terrifiante de l'année :) –

0

La seule solution que je l'ai trouvé à ce jour est l'exécution d'une seconde requête d'extraction, qui est semblable à la demande d'extraction initiale, sauf les différences suivantes:

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

Cela entraînera la demande d'extraction de retourner un tableau avec exactement un objet, l'objectID voulu. Les performances semblent bonnes, même lorsque le résultat de la requête d'extraction initiale contient 10000 objets.

S'il existe de meilleures façons de gérer cela, je serais heureux si quelqu'un pouvait les poster ici.

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"]); 

Étant donné que vos résultats sont déjà récupérés dans un tableau pourquoi ne pas les retirer avec le valueForKey: @ « objectID »? Propre, simple, vous n'avez besoin que d'une requête d'extraction pour pouvoir extraire toutes les autres données dont vous avez besoin.

+1

Jason veut des résultats dans un format de dictionnaire, tandis que votre approche renvoie un objet géré fautif – unixo

0

réponse Nick Hutchinson à Swift:

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

Je ne peux pas commenter parce que je n'ai pas assez rep :(

Questions connexes