使用MagicalRecord插入数据

时间:2015-04-30 09:40:17

标签: objective-c core-data 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

你能告诉我如何用魔法记录插入记录吗?

2 个答案:

答案 0 :(得分:0)

错误:

  • Cocoa error 133000是:
  

NSManagedObjectReferentialIntegrityError = 133000,//尝试触发指向不存在的对象的错误(我们可以看到商店,我们看不到该对象)

  • (取自this SO问题)。基本上你正在做一些不存在的NSManagedObject

插入数据:

  • 关于如何使用魔法记录插入数据,请查看this tutorial,这可能会比我更好地解释它。

我的建议:

  • 直接使用Core Data。这是一个非常陡峭的学习曲线,但很快变得直观且易于使用。如果您知道这一切是如何运作的,而不是依赖第三方,它也将使您处于有利地位。

  • 如果您对更基本的工作方式感兴趣,请查看SQLite。我不一定会建议使用它,因为它是C library,但它会帮助您更深入地理解。

答案 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中创建实体的正确方法。