En cualquier caso, no guarde después de insertar cada objeto, o prepárese para actuaciones terribles.
Aquí está el código que utilizo para rellenar un repositorio de Core Data en el primer lanzamiento.
#define MAX_UNSAVED_AIRPORTS_BEFORE_SAVE 1000
int numAirports = 0;
int numUnsavedAirports = MAX_UNSAVED_AIRPORTS_BEFORE_SAVE; // *** bug. see below
for (NSDictionary *anAirport in initialAirports) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Airport *newAirport = [NSEntityDescription insertNewObjectForEntityForName:@"Airport" inManagedObjectContext:managedObjectContext];
newAirport.city = [anAirport objectForKey:@"city"];
newAirport.code = [anAirport objectForKey:@"code"];
newAirport.name = [anAirport objectForKey:@"name"];
newAirport.country_name = [anAirport objectForKey:@"country_name"];
newAirport.latitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"latitude"] doubleValue]];
newAirport.longitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"longitude"] doubleValue]];
newAirport.altitude = [NSNumber numberWithDouble:[[anAirport objectForKey:@"altitude"] doubleValue]];
numAirports++;
numUnsavedAirports++;
if (numUnsavedAirports >= MAX_UNSAVED_AIRPORTS_BEFORE_SAVE) {
if (![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
numUnsavedAirports = 0;
}
[pool release];
}
Tampoco se olvide de guardar una última vez después del bucle.
También tenga en cuenta que existe un error que dará lugar a un accidente si las tres condiciones siguientes:
- El repositorio está vacío
- Usted tiene una UITableView con secciones
- Su la primera guarda guarda más de un objeto.
La solución en el código anterior es para inicializar el numUnsavedAirports
a MAX_UNSAVED_AIRPORTS_BEFORE_SAVE
con el fin de asegurarse de que el primer salvamento sucede después de la primera inserción.
Espero que esto ayude.
Guardar cada objeto individualmente producirá un rendimiento terrible. –