J'ai un NSFetchRequest
qui renvoie les propriétés des objets dans un NSDictionaryResultType
. Est-il possible d'obtenir également ObjectId des objets dans ce dictionnaire? Sinon, je devrai exécuter la requête avec un type de retour de NSManagedObjectResultType
, ce qui est beaucoup plus lent pour un grand nombre d'éléments retournés.Données de base, comment obtenir l'ObjectId de NSManagedObject lorsque NSFetchRequest renvoie NSDictionaryResultType?
Répondre
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.
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.
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.
Jason veut des résultats dans un format de dictionnaire, tandis que votre approche renvoie un objet géré fautif – unixo
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 :(
Nice trouver Nick, et votre documentation l'exemple a été très apprécié –
Ceci est une réponse terrifiante de l'année :) –