Mav*_*vro 6 core-data relationship ios swift
我很难过,无法找到关于如何做到这一点的任何教程或文档.
问题:我有两个实体,Person和Location.人可以有很多地方.我已经正确设置了一切,可以在桌面视图中添加/删除人员,没问题.
我遇到的问题是在创建第一个之后尝试添加和删除位置 - 当第一次插入人时,它还会添加一个位置.
为此,PersonModel(Person Entity)类具有:
class PersonModel: NSManagedObject {
@NSManaged var Name: String
@NSManaged var Age: String
@NSManaged var Location: NSOrderedSet
}
Run Code Online (Sandbox Code Playgroud)
LocationModel类(Location Entity)具有:
class LocationModel: NSManagedObject {
@NSManaged var State: String
@NSManaged var Person: PersonModel
}
Run Code Online (Sandbox Code Playgroud)
访问和删除位置实体中的项目的最佳方法是什么?我应该从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()
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它返回所有位置,而不仅仅是与父/相关人员关联的对象的位置.必须有一个简单的方法来做到这一点 - 也许用谓词?
有人能指点我正确的方向吗?
谢谢!
更新: 对于未来有同样挑战的人.
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()
}
}
Run Code Online (Sandbox Code Playgroud)
使用谓词是完全正确的。您想要设置谓词fetchRequest
let predicate = NSPredicate(format: "uniqueKey == %@", "value")
fetchRequest.predicate = predicate
Run Code Online (Sandbox Code Playgroud)
然后就可以删除结果了
| 归档时间: |
|
| 查看次数: |
6827 次 |
| 最近记录: |