2015-03-16 2 views
6

Ho una lista di oggetti da CoreData in tanto sono objectId da uno di quegli oggetti:Come posso ottenere l'entità dei dati di base dal suo objectID?

let fetchedId = poi.objectID.URIRepresentation() 

Ora ho bisogno di ottenere entità per questo specifico objectID. E ho provato qualcosa di simile:

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) 

ma ottengo l'errore:

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

Perché creare una richiesta di recupero quando è possibile eseguire 'objectWithID:'? –

risposta

12

Non è possibile interrogare le proprietà arbitrarie della NSManagedObject con un predicato per un NSFetchRequest. Funzionerà solo per gli attributi definiti nella tua entità.

NSManagedObjectContext ha due modi per recuperare un oggetto con NSManagedObjectID. Il primo solleva un'eccezione se l'oggetto non esiste nel contesto:

managedObjectContext.objectWithID(objectID) 

Il secondo fallirà restituendo nil:

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

Se si dispone di un URI invece di un NSManagedObjectID devi prima trasformarlo in un NSManagedObjectID. Per questo viene utilizzato persistentStoreCoordinator:

let objectID = managedObjectContext.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(uri) 
+2

Penso che questo sia il modo sbagliato a meno che non sia stato modificato in swift 3 - 'context.existingObject (con: objectID)' genera, 'context.object (con: objectID)' restituisce nil se non trovato – mbdavis

1

Quello che ottieni non è l'ID oggetto, ma l'URI. L'ID oggetto è una parte dell'URI. Puoi chiedere al coordinatore del negozio permanente l'ID oggetto con - managedObjectIDForURIRepresentation:. Avendo l'ID oggetto è possibile ottenere l'oggetto dal contesto usando ad esempio -objectWithID:. Ma per favore guarda la documentazione, di questi metodi per alcuni motivi.