使用 MagicalRecord 插入后 CoreData 关系未更新

Posted

技术标签:

【中文标题】使用 MagicalRecord 插入后 CoreData 关系未更新【英文标题】:CoreData Relationship not updating after insert using MagicalRecord 【发布时间】:2014-09-08 15:03:13 【问题描述】:

我有一个有两个视图的应用程序。第一个允许在 Core Data 中创建多个实体,第二个允许显示创建的实体的数据。

在我的 CoreData 数据模型中,我有两个实体:

CD_AProductCD_AProductItems

CD_AProduct 包含一个名为 productItems 的可选关系,其为 CD_AProductItems

CD_AProductItems 包含一个名为 product 的非可选关系,女巫是 CD_AProduct

AppDelegate 类中,我像这样实例化核心数据堆栈:

MagicalRecord.setupAutoMigratingCoreDataStack()

第一个视图的代码

然后在我的代码中,我第一次创建四个 CD_AProductItems 并链接关系:

if let entity = CD_ProductItem.MR_createEntity() as? CD_ProductItem

    product.addProductItemsObject(entity)

    entity.product = product

    success()

else

    failure()

然后,我将实体保存在持久存储中:

NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreWithCompletion((successBlock : Bool, error : NSError!) in

        if successBlock
        
            success()
        
        else
                                    
            if error != nil
            
                failure()
            
            else
            
                success()
            
        
    
)

第二个视图的代码

// Product is retrieved with CD_AProduct.MR_findFirstByAttribute
for productItem in product.productItems

    println("productItem: \(productItem)")   


现在这有什么问题。

第一个视图:用户“选择”了 4 个产品项以添加到产品中。 单击我的视图右上角的按钮转到下一个视图。 第二个视图:显示创建的 4 个产品项的数据。 使用视图左上角的按钮返回第一页。 第一个视图:在我的产品中再添加 4 个产品项 转到下一页 第二个视图:仅显示 4 个产品项目而不是 8 个!

我认为这个问题来自核心数据堆栈,当我转到第二个视图(显示所选产品项目数据的那个)时,它没有更新。

关于发生了什么以及如何确保整个核心数据堆栈在进入第二个视图之前已更新的任何建议?

【问题讨论】:

【参考方案1】:

据我了解,您需要在不同的 indexPath 中使用不同的元素,因此在这种情况下,您应该在转到下一个 viewController 之前提供要找到的 indexPath。此时您正在加载包含product.productItems 的所有项目。因为您的帖子中的代码很少,所以假设您将 UITableView 作为第一个控制器。

首先,您需要创建一个存储 CD_AProduct 元素的数组:

var productArrays = [CD_AProduct]!

您有保存功能,所以我们将在此处跳过此步骤。

然后只需创建简单的 prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
   if (segue.identifier == "GoToDetailView") 
      let vc = segue.destinationViewController as! CD_AProductItemsView
      let CD_AProduct = productArrays[tableView.indexPathForSelectedRow()!.row]
      vc.CD_AProductDetailView = CD_AProduct
      vc.CD_AProductItemsDetailView = productArrays.detailEntities.allObjects as! Array
  

最后一行 detailEntities 中的 P.S 表示托管对象列表中的 NSSet。你应该改变它。

现在,如果您运行您的应用程序,它将崩溃,因为此时tableView.indexPath 将为零,因为没有人将此信息提供给 prepareForSegue。所以要解决这个问题,我们应该使用我们的didSelectRowAtIndexPath

self.performSegueWithIdentifier("GoToDetailView", sender: self)

我们完成了!当然,它的答案很晚,但也许会对某人有所帮助。

【讨论】:

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

Core Data MagicalRecord:获取请求并保存在多线程中。锁定获取的对象?

使用 Magical Record 将对象数组插入 Core Data

使用 MagicalRecord 插入数据

是否可以使用 MagicalRecord/Core Data 进行类似 UNION 的查询

MagicalRecord 插入太慢

Plain Core Data vs Core Data + Magical Record