web-dev-qa-db-fra.com

Comment puis-je obtenir l'entité de données principale par son ID d'objet?

J'ai une liste d'objets de coredata puis j'obtiens objectId d'un de ces objets:

let fetchedId = poi.objectID.URIRepresentation()

Maintenant, je dois obtenir une entité pour cet objectID spécifique. Et j'ai essayé quelque chose comme:

let entityDescription = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext!);

        let request = NSFetchRequest();
        request.entity = entityDescription;

        let predicate = NSPredicate(format: "objectID = %i", fetchedId);

        request.predicate = predicate;

        var error: NSError?;

        var objects = managedObjectContext?.executeFetchRequest(request,
            error: &error)

Mais j'obtiens une erreur:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath objectID not found in entity <NSSQLEntity Person id=4>'
8
1110

Vous ne pouvez pas interroger des propriétés arbitraires de NSManagedObject avec un prédicat pour NSFetchRequest. Cela ne fonctionnera que pour les attributs définis dans votre entité.

NSManagedObjectContext a deux manières de récupérer un objet avec un NSManagedObjectID. La première déclenche une exception si l'objet n'existe pas dans le contexte:

managedObjectContext.objectWithID(objectID) 

La seconde échouera en retournant nil:

var error: NSError?
if let object = managedObjectContext.existingObjectWithID(objectID, error: &error) {
    // do something with it
}
else {
    println("Can't find object \(error)")
}

Si vous avez un URI au lieu d'un NSManagedObjectID, vous devez d'abord le transformer en un NSManagedObjectID. PersistentStoreCoordinator est utilisé pour cela:

let objectID = managedObjectContext.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(uri)
16
Matthias Bauch

Ce que vous obtenez n'est pas l'ID d'objet, mais l'URI. L'ID d'objet est une partie de l'URI. Vous pouvez demander au coordinateur de magasin persistant l'ID d'objet avec - managedObjectIDForURIRepresentation:. Ayant l'ID d'objet, vous pouvez obtenir l'objet du contexte en utilisant par exemple -objectWithID:. Mais s'il vous plaît regardez la documentation, de ces méthodes pour quelques raisons.

2
Amin Negm-Awad