38 votes

De base de données, comment obtenir NSManagedObject de l'ObjectId quand NSFetchRequest retourne NSDictionaryResultType?

J'ai un NSFetchRequest , qui est de retourner les propriétés d'objets dans un NSDictionaryResultType. Est-il possible également d'obtenir des objets ObjectId au sein de ce dictionnaire? Sinon je vais avoir besoin pour exécuter la requête avec un type de retour d' NSManagedObjectResultType ce qui est beaucoup plus lent pour un grand nombre d'articles retournés.

82voto

Nick Hutchinson Points 1831

Oui, vous pouvez, à l'aide de la très chouette mais mal documenté NSExpressionDescription classe. Vous devez ajouter une correctement configuré NSExpressionDescription objet de la matrice d' NSPropertyDescription objets que vous définissez via setPropertiesToFetch: 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 un @"objectID" - clés dans les dictionnaires que vous revenez de votre demande de récupération.

4voto

Michael Shaw Points 55
 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"]);

Depuis votre récupéré les résultats sont déjà dans un tableau, pourquoi ne pas les sortir de la valueForKey:@"objectID" ? Propre, simple seulement besoin d'une demande de récupération de sorte que vous pouvez tirer de toutes les autres données dont vous avez besoin ainsi.

-1voto

rsobik Points 54

La seule solution que j'ai trouvé pour l'instant est de l'exécution d'une deuxième demande de récupération, qui est similaire à la première demande de récupération à l'exception des 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];

Ce sera la cause de la demande de récupération pour retourner un tableau avec exactement un objet, l'voulu objectID. La Performance semble bonne, même lorsque la première demande de récupération du résultat contient 10000 objets.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X