这是核心数据中我不确定的事情。
假设我有一个这样的循环:
for (int i=0; i<count; i++) {
myManagedClass *myData = [NSEntityDescription insertNewObjectForEntityForName:@"myEntity"
inManagedObjectContext:context];
// adjust myData properties, something like
// myData.name = [name objectAtIndex:i];
// myData.address = [address objectAtIndex:i];
// etc
}
显然,除非我提交更改,否则此循环不会更改数据库上的任何内容。由于我认为Core Data是智能的,我想我必须把这个
NSError *error = nil;
if (![contexto save:&error]) {
// Handle the error.
}
在循环之外,对吗?我的意思是,我在循环中创建的所有对象都被添加到上下文中,一旦循环完成,我提交更改,将它们存储在数据库中吗?
另一个问题:
答案 0 :(得分:1)
主要问题:对。
问题1:否。
问题2:这取决于托管对象的大小。除了可用于应用程序的内存大小之外,上下文本身对象图的大小没有限制。
第一个好的做法是利用对象图中的错误。例如,如果需要托管对象的属性(在故障中)与上下文中已有的对象相关,则仅获取属性,而不是整个托管对象。如果您需要与对象相关的对象(在故障中)的属性(也在故障中)与上下文中的对象相关,请使用KVC仅获取属性,使两个相关对象出现故障。
第二个好的做法是在适当的时候向上下文发送refreshObject:managedObject mergeChanges:NO
个消息。通过将参数mergeChanged
设置为NO
,此消息将简单地使对象出错并释放它使用的内存。在极端情况下,您可以发送reset
消息来判断上下文中的所有对象。
另外,如果您不使用该功能,请将上下文的撤消管理器设置为nil
。最后,考虑在紧密,繁重的循环中创建/获取大量托管对象时使用自定义自动释放池。例如,
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
for (int i=0; i<count; i++) {
myManagedClass *myData = [NSEntityDescription
insertNewObjectForEntityForName:@"myEntity"
inManagedObjectContext:context];
// adjust myData properties, something like
// myData.name = [name objectAtIndex:i];
// myData.address = [address objectAtIndex:i];
// etc
}
[localPool release];
这取决于你在循环中做了什么,是否有自动释放池是有帮助的/相关的。