SWIFT 的核心数据:如何从关系实体中删除对象?

Posted

技术标签:

【中文标题】SWIFT 的核心数据:如何从关系实体中删除对象?【英文标题】:Core Data with SWIFT: How to delete object from Relationship entity? 【发布时间】:2015-02-06 21:15:29 【问题描述】:

我很困惑,无法找到任何关于如何最好地做到这一点的教程或文档。

问题:我有两个实体,Person 和 Location。人可以有许多位置。我已经正确设置了所有内容,并且可以从 tableview 添加/删除人员,没问题。

我遇到的问题是在创建第一个位置后尝试添加和删除位置——当第一次插入该人时,它也会添加一个位置。

为此,PersonModel(Person Entity)类有:

class PersonModel: NSManagedObject 

    @NSManaged var Name: String
    @NSManaged var Age: String
    @NSManaged var Location: NSOrderedSet


LocationModel 类(位置实体)有:

class LocationModel: NSManagedObject 

    @NSManaged var State: String
    @NSManaged var Person: PersonModel


在 Location 实体中访问和删除项目的最佳方式是什么?我应该从 PersonsModel 还是通过 LocationsModel 删除对象?

执行以下操作:

func deleteObject(rowIndex:NSIndexPath)
  let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
  let managedContext = appDelegate.managedObjectContext!
  let fetchRequest = NSFetchRequest(entityName:"Locations")

  var error: NSError?
  locationsArray = managedContext.executeFetchRequest(fetchRequest,error: &error)!
  managedContext.deleteObject(locationsArray[rowIndex.row] as NSManagedObject)

  var error:NSError? = nil
    if (!managedContext.save(&error))
        abort()
    
 

这不起作用,因为它返回所有位置,而不仅仅是与父/相关人员关联的对象的位置。必须有一种简单的方法来做到这一点——也许用谓词?

有人可以帮我指出正确的方向吗?

谢谢!

更新: 对于未来面临同样挑战的人。

1) 确保关系删除规则正确。就我而言,我希望能够删除位置但保留人员。删除规则需要设置如下:位置 - 删除规则:级联,人员 - 删除规则:Nullify

2) 最终代码如下所示:

func deleteTrigger(rowIndex:NSIndexPath)

   var personRef: PersonModel = existingItem as PersonModel
   let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
   let managedContext:NSManagedObjectContext = appDelegate.managedObjectContext!
   let fetchRequest = NSFetchRequest(entityName:"Locations")
   let predicate = NSPredicate(format: "Person == %@", personRef)
   fetchRequest.predicate = predicate

   var error: NSError? = nil
   locationArray = managedContext.executeFetchRequest(fetchRequest,error: &error)!

   managedContext.deleteObject(locationArray[rowIndex.row] as NSManagedObject)
   locationArray.removeAtIndex(rowIndex.row)
   tableview.deleteRowsAtIndexPaths([rowIndex], withRowAnimation: UITableViewRowAnimation.Fade)

   if (!managedContext.save(&error))
     abort()
   


【问题讨论】:

【参考方案1】:

使用谓词是完全正确的。您想为fetchRequest 设置谓词

let predicate = NSPredicate(format: "uniqueKey == %@", "value")
fetchRequest.predicate = predicate

然后你可以删除结果

【讨论】:

【参考方案2】:

怎么样:

locationsArray = personRef.Location

我认为它更简单

【讨论】:

以上是关于SWIFT 的核心数据:如何从关系实体中删除对象?的主要内容,如果未能解决你的问题,请参考以下文章

删除核心数据对象时,如何在 Swift 5 中同时删除其所有相关对象?

如何在 swift 3 中从核心数据中删除对象

iOS:删除核心数据中具有一对多关系的实体

如何从数据核心 swift 4 中删除 tableview index.row

在 Swift 2 中删除实体的核心数据

核心数据:如何删除关系中的实体