使用 MagicalRecord 插入数据

Insert data with MagicalRecord

我正在使用 CoreDataMagicalRecord
我想在下面的代码中插入 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,这可能会比我解释得更好。

我的建议:

  • 直接使用Core Data。这是一个相当陡峭的学习曲线,但很快就会变得直观且易于使用。如果您知道这一切是如何工作的而不是依赖第三方,它也会对您有好处。

  • 如果您对它在更基础层面上的工作原理感兴趣,请查看 SQLite. I wouldn't necessarily recommend using it as it is a C library,但它将帮助您获得更深入的理解。

当您尝试访问不存在的对象时出现错误 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 中创建实体的正确方法。