使用 Magical Record 将对象数组插入 Core Data
Posted
技术标签:
【中文标题】使用 Magical Record 将对象数组插入 Core Data【英文标题】:Insert array of objects into Core Data with Magical Record 【发布时间】:2014-08-14 13:56:29 【问题描述】:我是 Core Data 和神奇记录的菜鸟,插入数据时遇到问题。
返回 JSON 的 Web 服务:
核心数据数据库:
Objective-C 代码
- (void)fetchDocumentsOnCompletion:(void(^) (NSDictionary *data,NSError *error))completionBlock
[self GET:@"documents" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject)
NSArray *documentsArray = [Document MR_importFromArray:responseObject[@"documents"]];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
[Document MR_importFromArray:documentsArray inContext:localContext];
completion:^(BOOL success, NSError *error)
];
failure:^(NSURLSessionDataTask *task, NSError *error)
completionBlock(nil, error);
];
如果我在下面放一个断点
NSArray *documentsArray = [Document MR_importFromArray:responseObject[@"documents"]];
数组有这个值:
但是当我删除断点并再次编译时,我得到了这个崩溃:
我没有找到错误,请任何人帮助我吗?
【问题讨论】:
【参考方案1】:尝试使用 _id 作为属性名而不是 id
【讨论】:
核心数据编辑器不允许我写_id。自动改成id【参考方案2】:要使用 MagicalRecord 保存和获取数据,您需要将数据保存在本地上下文中,然后询问对象的唯一 ID。然后使用谓词来检索它们。
我在我的代码中使用了类似的东西:
- (void)fetchDocumentsOnCompletion:(void(^) (NSArray *data, NSError *error))completionBlock
[self GET:@"documents" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject)
// Create an array that's going to save all your unique
// newly created object ids
//
NSMutableArray *objectIDs = [NSMutableArray array];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
NSArray *documentsArray = [Document MR_importFromArray :responseObject[@"documents"] inContext:localContext];
// Obtain Permanent Id used to retrieve objects after
// it's being saved
//
NSError *error;
if ([localContext obtainPermanentIDsForObjects:documentsArray error:&error])
for (NSManagedObject *obj in documentsArray)
[objectIDs addObject:[obj objectID]];
completion:^(BOOL success, NSError *error)
// Fetch items
//
id newlyCreatedItemsNowInMainContext = !error ? [Document findAllWithPredicate:[NSPredicate predicateWithFormat:@"self IN %@", objectIDs]] : nil)
if (completionBlock)
completionBlock(newlyCreatedItemsNowInMainContext, error)
];
failure:^(NSURLSessionDataTask *task, NSError *error)
completionBlock(nil, error);
];
【讨论】:
我遵循了您的回答,但它正在重复结果。见这里:***.com/questions/39634680/…以上是关于使用 Magical Record 将对象数组插入 Core Data的主要内容,如果未能解决你的问题,请参考以下文章
使用 Magical Record 在 NSDictionary 中导入数组