繁体   English   中英

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

[英]Core Data with SWIFT: How to delete object from Relationship entity?

我很难过,无法找到关于如何做到这一点的任何教程或文档。

问题:我有两个实体,Person和Location。 人可以有很多地方。 我已经正确设置了一切,可以在桌面视图中添加/删除人员,没问题。

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

为此,PersonModel(Person Entity)类具有:

class PersonModel: NSManagedObject {

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

}

LocationModel类(Location Entity)具有:

class LocationModel: NSManagedObject {

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

}

访问和删除位置实体中的项目的最佳方法是什么? 我应该从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()
   }

}

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

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

然后你可以删除结果

怎么样:

locationsArray = personRef.Location

我认为这要简单得多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM