SWIFT 的核心数据:如何从关系实体中删除对象?
Core Data with SWIFT: How to delete object from Relationship entity?
我很困惑,无法找到任何关于如何最好地做到这一点的教程或文档。
问题:我有两个实体,Person 和 Location。人可以有很多位置。我已经正确设置了所有内容,并且可以 add/remove 人从 tableview 中,没问题。
我遇到的问题是在创建第一个位置后尝试添加和删除位置——当第一次插入此人时,它还会添加一个位置。
为此,PersonModel(个人实体)class 具有:
class PersonModel: NSManagedObject {
@NSManaged var Name: String
@NSManaged var Age: String
@NSManaged var Location: NSOrderedSet
}
LocationModel class(位置实体)有:
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()
}
}
这不起作用,因为它 returns 所有位置,而不仅仅是与 parent/related 人关联的对象的位置。必须有一种简单的方法来做到这一点——也许使用谓词?
有人可以帮我指明正确的方向吗?
谢谢!
更新:
对于未来面临同样挑战的人。
1) 确保关系删除规则正确。就我而言,我希望能够删除位置但保留人物。删除规则需要设置如下:Location - Delete Rule: Cascade, Person - Delete Rule: 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
我觉得简单多了
我很困惑,无法找到任何关于如何最好地做到这一点的教程或文档。
问题:我有两个实体,Person 和 Location。人可以有很多位置。我已经正确设置了所有内容,并且可以 add/remove 人从 tableview 中,没问题。
我遇到的问题是在创建第一个位置后尝试添加和删除位置——当第一次插入此人时,它还会添加一个位置。
为此,PersonModel(个人实体)class 具有:
class PersonModel: NSManagedObject {
@NSManaged var Name: String
@NSManaged var Age: String
@NSManaged var Location: NSOrderedSet
}
LocationModel class(位置实体)有:
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()
}
}
这不起作用,因为它 returns 所有位置,而不仅仅是与 parent/related 人关联的对象的位置。必须有一种简单的方法来做到这一点——也许使用谓词?
有人可以帮我指明正确的方向吗?
谢谢!
更新: 对于未来面临同样挑战的人。
1) 确保关系删除规则正确。就我而言,我希望能够删除位置但保留人物。删除规则需要设置如下:Location - Delete Rule: Cascade, Person - Delete Rule: 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
我觉得简单多了