我正在对应用程序进行收尾处理,并且在批量删除记录时遇到困难。在一个按钮的点击一组约。需要将3500条记录添加到数据库中。这不是问题,需要大约。 3-4秒。删除/删除核心数据中的记录非常非常慢
但有时(不经常,但选项需要在那里)所有这些记录需要删除。我刚刚执行了这个操作,花了20分钟。这里有什么可能是错的?只有一个依赖关系,所有记录都是特定集合的子集。
我将所有项目添加到一个集合中,将它们从集合中删除,然后逐个删除。每5%我更新一次对话,当一切完成时,我会提交更改。但在取出物品只需要在年龄DOItemController(我可以看到进度对话的进展非常缓慢)
- (void) deleteList:(DOCollection *) collection {
// For the progress dialogue
NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObject:@"Clearing vocabulary list!" forKey:@"message"];
float totalItems = [collection.items count];
float progress = 0;
float nextProgressRefresh = 0.05;
NSMutableSet* itemsSet = [NSMutableSet set];
for (DOItem* item in collection.items) {
[itemsSet addObject:(NSNumber*)[NSNumber numberWithInt:[item.itemId intValue]]];
}
// Remove all of them from the collection
[managedObjectContext performBlockAndWait:^{
[collection setItems:[NSSet set]];
}];
for (NSNumber* itemId in itemsSet) {
DOItem* item = [itemController findItem:[itemId intValue]];
if (item != nil) {
[[self itemController] removeItem:item];
}
progress++;
if((nextProgressRefresh < (progress/totalItems))){
NSString* sProgress = [NSString stringWithFormat:@"%f", (progress/totalItems) * 0.85];
//[dict setValue:@"Saving the database...!" forKey:@"message"];
[dict setValue:sProgress forKey:@"progress"];
[[NSNotificationCenter defaultCenter] postNotificationName:kUpdatePleaseWaitDialogue object:dict];
nextProgressRefresh = nextProgressRefresh + 0.05;
}
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[managedObjectContext performBlockAndWait:^{
[[self collectionController] commitChanges];
}];
[[NSNotificationCenter defaultCenter] postNotificationName:kSavingDataComplete object:nil];
});
//NSLog(@"Wait 2!");
[NSThread sleepForTimeInterval:1];
}
:
- (void) removeItem: (NSManagedObject*) item {
[[self managedObjectContext] deleteObject:item];
}
DOCollection是一个托管对象吗?或者不仅仅是一组管理对象? – timthetoolman 2012-01-07 21:27:06
是的都是管理对象 – 2012-01-08 07:44:04
你有核心数据模型中级联删除的设置吗? – timthetoolman 2012-01-08 08:30:35