Estoy trabajando en una aplicación de iPhone que obtiene una cantidad de objetos de una base de datos. Me gustaría almacenar estos usando Core Data, pero estoy teniendo problemas con mis relaciones.Agregar objetos únicos a Core Data
Un detalle contiene cualquier cantidad de PDI (puntos de interés). Cuando recojo un conjunto de PDI del servidor, contienen una identificación detallada. Para asociar el PDI con el Detalle (por ID), mi proceso es el siguiente: Consulte el ManagedObjectContext para el detailID. Si ese detalle existe, agregue el poi a él. Si no es así, cree el detalle (tiene otras propiedades que se poblarán perezosamente).
El problema con esto es el rendimiento. Realizar consultas constantes a Core Data es lento, hasta el punto de que agregar una lista de 150 POI lleva un minuto gracias a las múltiples relaciones involucradas.
En mi viejo modelo, antes de Datos Básicos (varios objetos de caché NSDictionary) este proceso fue muy rápida (mirar hacia arriba una clave en un diccionario, entonces créelo si no existe)
tengo más relaciones que solo este, pero casi todos tienen que hacer este control (algunos son muchos para muchos y tienen un problema real).
¿Alguien tiene alguna sugerencia sobre cómo puedo ayudarlo? Podría realizar menos consultas (buscando una cantidad de ID diferentes), pero no estoy seguro de cuánto ayudará esto.
Algunos código:
POI *poi = [NSEntityDescription
insertNewObjectForEntityForName:@"POI"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
poi.POIid = [attributeDict objectForKey:kAttributeID];
poi.detailId = [attributeDict objectForKey:kAttributeDetailID];
Detail *detail = [self findDetailForID:poi.POIid];
if(detail == nil)
{
detail = [NSEntityDescription
insertNewObjectForEntityForName:@"Detail"
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
detail.title = poi.POIid;
detail.subtitle = @"";
detail.detailType = [attributeDict objectForKey:kAttributeType];
}
-(Detail*)findDetailForID:(NSString*)detailID {
NSManagedObjectContext *moc = [[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Detail" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"detailid == %@", detailID];
[request setPredicate:predicate];
NSLog(@"%@", [predicate description]);
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil || [array count] != 1)
{
// Deal with error...
return nil;
}
return [array objectAtIndex:0];
}
Explique sus objetos con más detalle y publique parte del código que utiliza. Es casi 100% probable que haya una manera de hacer lo que ya está haciendo mucho más rápido. – Sneakyness