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 :(
- 1. Données de base - Obtenir/créer les performances de NSManagedObject
- 2. Problème NSManagedObject setValue (Données de base)
- 3. NSFetchedResultsController renvoie toujours des objets NSManagedObject au lieu de personnalisés
- 4. Que fait SimpleJDBCTemplate.queryForInt lorsque la base de données renvoie null?
- 5. iOS: erreur de données de base: NSMergeConflict pour NSManagedObject
- 6. iPhone et données de base - Suppression de NSManagedObject?
- 7. Données de base: récupérer un objet NSManagedObject par ses propriétés
- 8. Syntaxe de prédicat NSFetchRequest
- 9. Enregistrer les données aux attributs dans les données de base
- 10. Core Data NSFetchRequest problème
- 11. Les extractions de données de base (NSFetchRequest) sont-elles triées de façon spécifique par défaut?
- 12. Comment faire une copie profonde de NSManagedObject dans les données de base
- 13. récupérer seul objet de NSFetchRequest
- 14. Impression de données de base
- 15. NSPredicate pour la longueur d'un attribut de chaîne de NSManagedObject
- 16. Données de base: tri NSFetchRequest par nombre de relations to-many
- 17. NSManagedObject - Comment obtenir le type de la propriété
- 18. NSManagedObject Comment recharger
- 19. Extraction d'attributs du tableau NSManagedObject
- 20. Tableau de valeurs distinctes pour l'index de View Controller utilisant des données de base
- 21. Présentation de NSManagedObject
- 22. comment obtenir la valeur de champs de base de données de la base de données sqlite?
- 23. Session.load renvoie InvocationException lorsque l'ID n'est pas dans la base de données
- 24. Cocoa-Touch, Données de base: erreur de lien, symbole NSManagedObject introuvable
- 25. Comment obtenir des données d'une base de données vers une autre base de données?
- 26. Lorsque créer une nouvelle base de données
- 27. Accélérer l'extraction des données de base
- 28. Multithreading brisé avec des données de base
- 29. Persisting NSMutableArray qui est propriété de base de données Entité
- 30. données de base n'extraient que renvoie des objets gérés uniques
Nice trouver Nick, et votre documentation l'exemple a été très apprécié –
Ceci est une réponse terrifiante de l'année :) –