使用 MagicalRecord 插入数据
Posted
技术标签:
【中文标题】使用 MagicalRecord 插入数据【英文标题】:Insert data with MagicalRecord 【发布时间】:2015-04-30 09:40:16 【问题描述】:我正在使用 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)
];
数据.h
@interface Data : NSManagedObject
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * title;
@end
你能告诉我如何用 Magical Record 插入记录吗?
【问题讨论】:
【参考方案1】:错误:
Cocoa error 133000
是:
(取自this SO问题)。基本上,您正在使用不存在的NSManagedObjectReferentialIntegrityError = 133000, // 尝试触发一个指向不存在的对象的故障(我们可以看到存储,我们看不到对象)
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 插入后 CoreData 关系未更新
如何在objective-c中使用可可豆荚升级magic record sdk