使用 MagicalRecord 插入数据

Posted

技术标签:

【中文标题】使用 MagicalRecord 插入数据【英文标题】:Insert data with MagicalRecord 【发布时间】:2015-04-30 09:40:16 【问题描述】:

我正在使用 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) 
    ];

数据.h

@interface Data : NSManagedObject

@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * title;

@end

你能告诉我如何用 Magical Record 插入记录吗?

【问题讨论】:

【参考方案1】:

错误:

Cocoa error 133000 是:

NSManagedObjectReferentialIntegrityError = 133000, // 尝试触发一个指向不存在的对象的故障(我们可以看到存储,我们看不到对象)

(取自this SO问题)。基本上,您正在使用不存在的NSManagedObject 做某事。

插入数据:

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

我的建议:

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

如果您对它在更基础层面的工作方式感兴趣,请查看SQLite。我不一定推荐使用它,因为它是 C library,但它会帮助您更深入地了解。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 MagicalRecord 插入数据的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 插入太慢

MagicalRecord saveWithBlockAndWait

Swift 3 - MagicalRecord:如何在空实体上使用 findFirst

使用 forEach() 和 Node.js 插入数据

MyBatis中的循环插入insert foreach

使用foreach批量插入数据时报“SQL 命令未正确结束”