是否有更简单的方法可以在Core Data中执行以下操作:
Entry *entry = [[Entry alloc] init];
entry.name = @"An Entry";
[entry save];
我意识到您不必分配NSManagedObject,必须直接插入上下文中,如下所示:
Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
inManagedObjectContext:[self managedObjectContext]];
但这是很多代码。此外,我想通过消息传递进行保存,而不是保存整个上下文:
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
我可以将它们放在NSManagedObject抽象类中,让我的托管对象扩展该抽象类吗?基本上,我只是想在我的模型中封装更多,并在我的控制器中编写更少的代码。任何帮助表示赞赏。
答案 0 :(得分:1)
您可以定义自己的NSManagedObject
子类,并设置所有实体以使用它。
子类可以包含您定义的任何初始化/保存模式,只要它调用正确的父类的初始化器。
您可以使用+entity
方法,该方法可能链接到静态定义的上下文(当然,这会将您限制为单个托管对象上下文,但只要您还可以调用更多内容,这并不总是很糟糕当你需要第二个上下文时,原始的初始化者。)
您甚至可能拥有+entityWithName:
方法。
至于保存上下文,您可以再次定义子类并添加一个简单的-save
方法,该方法保存上下文并在保存失败时抛出异常。您可以选择使用扩展NSManagedObject
类的类别而不是子类来执行此操作。
请注意,无法保存只是您对该一个条目对象所做的更改。您只能将所有更改保存到整个托管对象上下文。如果需要保存单个记录,则需要创建临时托管对象上下文,对其进行单个更改,然后保存临时上下文,然后将临时上下文更改同步到当前存在的所有其他托管对象上下文在应用程序中(有一个API可以使这个复杂的过程相对容易)。
我不喜欢您发布的用于保存上下文的代码,原因如下:
managedObjectContext
的{{1}}变量。在几乎所有情况下,这是一个额外的代码行,没有任何好处。充其量只是让你的代码难以阅读,最糟糕的是你可能会引入错误。self.managedObjectContext
?通常,您应该设计代码,使其不能nil
。 nil
检查对象的构造函数,以及nil
是否为严重失败。你的整个应用程序对用户来说完全无用,你应该向用户说明他们不能通过做一些激烈的事情来使用应用程序,例如崩溃(错误警报首先会很好,但我不会麻烦。我只是抛出异常)。nil
?我想不出你需要做这个检查的很多情况。也许您的应用程序允许用户进行许多更改,然后在几分钟后保存它们?这是不好的。在进行一组更改后,应该在几毫秒内更改上下文,否则您将面临数据丢失的风险。您的应用程序可能会崩溃,手机可能会耗尽电量,或者用户可能会收到一个电话,而您的应用程序正在消耗足够的RAM,操作系统会立即终止它以显示“来电”屏幕。您不需要检查hasChanges
,因为您在进行一些更改后总是立即执行保存操作。hasChanges
,它实际上仅对开发和beta版本有用。答案 1 :(得分:0)
结帐
NSManagedObject + ActiveRecord.h
Inside Restkit:http://restkit.org/
它基于:
https://github.com/magicalpanda/MagicalRecord
我在RestKit应用程序中使用,但你可以很容易地采用它。
祝你好运