在任何情況下,都不會在插入每個對象後保存,或準備好可怕的表演。
以下是我在首次啓動時用於填充核心數據存儲庫的代碼。
#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