使用 MagicalRecord 插入数据
Insert data with MagicalRecord
我正在使用 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
你能告诉我如何使用 Magical Record 插入记录吗?
错误:
Cocoa error 133000
是:
NSManagedObjectReferentialIntegrityError = 133000, // attempt to fire a fault pointing to an object that does not exist (we can see the store, we can't see the object)
- (摘自 this SO 问题)。基本上你正在做一些不存在的
NSManagedObject
。
正在插入数据:
- 关于如何使用 magic record 插入数据,请查看 this tutorial,这可能会比我解释得更好。
我的建议:
当您尝试访问不存在的对象时出现错误 133000
。 "But hey",你可能会说,"what do you mean not existing? I'm creating it right there!"。
当您像您一样创建 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 中创建实体的正确方法。
我正在使用 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
你能告诉我如何使用 Magical Record 插入记录吗?
错误:
Cocoa error 133000
是:
NSManagedObjectReferentialIntegrityError = 133000, // attempt to fire a fault pointing to an object that does not exist (we can see the store, we can't see the object)
- (摘自 this SO 问题)。基本上你正在做一些不存在的
NSManagedObject
。
正在插入数据:
- 关于如何使用 magic record 插入数据,请查看 this tutorial,这可能会比我解释得更好。
我的建议:
当您尝试访问不存在的对象时出现错误 133000
。 "But hey",你可能会说,"what do you mean not existing? I'm creating it right there!"。
当您像您一样创建 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 没有持久化,您将无法获得接下来在
中使用的持久化 IDNSManagedObject *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 中创建实体的正确方法。