2010-02-21 14 views
16

La situación:CoreData: Cómo buscar un objeto específico utilizando un predicado

voy a buscar una tabla completa de mi base de datos de datos básicos SQLLite y mostrarla en un TableView así:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTable" 
              inManagedObjectContext:managedObjectContext]; 

El desafío:

¿Cómo obtengo el EntryID y obtengo la entrada específica de la base de datos (por ejemplo, si hago clic en una entrada)? Creo que esto va en la dirección correcta?

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(id = %@)", myEntryID]; 

Respuesta

45

Si usted tiene un objeto entrada llamada entry, sería un predicado como esto:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(SELF = %@)", entry]; 

lo que equivale aproximadamente a

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", entry.objectID]; 

Para una NSManagedObjectID, se obtiene algo así como:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", myEntryID]; 
+3

+1 Si tiene que usar un predicado, este es el camino a seguir. De lo contrario, '- [NSManagedObjectContext objectWithID:]' probablemente sea mejor. –

+2

Por supuesto, pero por ej. 'NSFetchedResultsController' tienes que usar un predicado. – MrMage

+5

La palabra clave "self" también funciona si está obteniendo * objetos * múltiples por sus objectIDs: 'NSPredicate * predicateForFetch = [NSPredicate predicateWithFormat: @" (self IN% @) ", arrayOfNSManagedObjectIDs];' – Wienke

3

Es posible que desee ver en -[NSManagedObject objectID] y -[NSManagedObjectContext objectWithID:].

2

Cuando construyes la tabla, lo haces con una matriz devuelta por una búsqueda o por la matriz implícita dentro de un NSFetchResultsController. Por lo tanto, el objeto que desea tiene el mismo índice en la matriz/controlador que en la tabla.

Por lo tanto, se convierte en una simple cuestión de llamar a:

myObject=[fetchedArray objectAtIndex:tableRowIndex]; 

o

myObject=[myFetchedResultsController objectAtIndexPath:tableRowIndex]; 

Este es el verdadero genio del pto. Siempre refleja el modelo de datos con precisión. Nunca debe traducir entre los índices de tabla y los índices de su modelo de datos.

6

Este es el predicado correcto:

[NSPredicate predicateWithFormat:@"SELF = %@", objectID]; 

Donde objectID es NSManagedObjectID instancia.

+0

Este fue el primer predicado que funcionó para mí. –

Cuestiones relacionadas