2015-02-06 61 views
5

我很困惑,一直无法追查任何教程或文件如何最好地做到这一点。核心数据与SWIFT:如何从关系实体中删除对象?

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

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

为了这个目的,PersonModel(Person实体)类有:

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 

} 

什么是访问和删除项目的最佳途径在位置实体?我应该从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)确保关系删除规则是正确的。就我而言,我希望能够删除位置,但保留该人员。删除规则需要被设置如下:位置 - 删除规则:级联,人 - 删除规则:废止

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() 
    } 

} 

回答

3

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

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

谓语,然后你就可以删除结果

0

如何:

locationsArray = personRef.Location 

我认为这是简单得多

相关问题