使用 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 中导入数组

Magical Record 的新手:上下文未在数据存储中创建行

Magical Record添加对象,不同的上下文错误

Magical Record 关系返回空对象

Magical Record 检测到默认上下文没有变化

如何将 setReturnsDistinctResults 与 Magical Record 一起使用?