我正在CoreData
使用MagicalRecord
我想在以下代码中插入Data
,但是插入数据会成为错误消息Cocoa error 133000
。
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"class_schedule.sqlite"];
return YES;
}
ViewController.m
- (void)saveData
{
Data *data = [Data MR_createEntity];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Data *localData = [data MR_inContext:localContext];
localData.title = textField.text;
} completion:^(BOOL success, NSError *error) {
}];
}
Data.h
@interface Data : NSManagedObject
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * title;
@end
你能告诉我如何用魔法记录插入记录吗?
答案 0 :(得分:0)
错误:强>
Cocoa error 133000
是:NSManagedObjectReferentialIntegrityError = 133000,//尝试触发指向不存在的对象的错误(我们可以看到商店,我们看不到该对象)
NSManagedObject
。插入数据:
我的建议:
答案 1 :(得分:0)
当您尝试访问不存在的对象时,会收到错误133000
。 “但是嘿”,你可能会说,“你的意思是什么不存在?我正在那里创造它!”。
当您创建NSManagedObject时,就像使用MR_createEntity
一样,它会调用
NSManagedObject *newEntity = [self MR_createEntityInContext:[NSManagedObjectContext MR_contextForCurrentThread]]
通过这样做不会以任何方式保存此上下文,并且不会保留创建的实体。然后通过调用
Data *localData = [data MR_inContext:localContext];
你实际上是在幕后制作这个:
BOOL success = [[self managedObjectContext] obtainPermanentIDsForObjects:@[self] error:&error];
问题是如果NSManagedObject没有持久存在,你将无法获得下次使用的持久性ID
NSManagedObject *inContext = [otherContext existingObjectWithID:[self objectID] error:&error];
上面的方法无法检索现有对象,因为它尚未存在于商店中(请记住,当前线程的上下文在其中不存储创建的实体)。
但不要担心,修复此问题非常简单。不要创建这样的新实体。而是这样做:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Data *localData = [data MR_createEntityInContext:localContext];
localData.title = textField.text;
} completion:^(BOOL success, NSError *error) {
}];
这样就可以在上下文中创建实体并进行修改,并立即进行保存。这是在MagicalRecord中创建实体的正确方法。