在任何情况下,都不会在插入每个对象后保存,或准备好可怕的表演。
以下是我在首次启动时用于填充核心数据存储库的代码。
#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];
}
另外不要忘记在循环后最后一次保存一次。
另外要注意,一个bug的存在,将导致崩溃,如果所有三个下列条件都满足:
- 资源库是空的
- 你有段一个UITableView
- 你首先保存保存多个对象。
在上面的代码的解决方法是初始化numUnsavedAirports
到MAX_UNSAVED_AIRPORTS_BEFORE_SAVE
为了确保第一插入后的第一个保存情况。
我希望这会有所帮助。
分别保存每个对象会产生可怕的表现。 – 2010-04-10 00:27:20