2015-02-06 23 views
5

Tôi đang bối rối và không thể theo dõi bất kỳ hướng dẫn hoặc tài liệu nào về cách tốt nhất để thực hiện việc này.Dữ liệu cốt lõi với SWIFT: Cách xóa đối tượng khỏi thực thể Mối quan hệ?

Sự cố: Tôi có hai thực thể, Person và Location. Người có thể có nhiều vị trí. Tôi có mọi thứ được thiết lập đúng cách và có thể thêm/xóa người khỏi một lần xem bảng, không sao cả.

Sự cố tôi đang gặp đang cố gắng thêm và xóa vị trí sau khi vị trí đầu tiên được tạo - khi người đó được chèn lần đầu tiên, nó cũng thêm vị trí.

Đối với mục đích này, (Person Entity) lớp PersonModel có:

class PersonModel: NSManagedObject { 

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

} 

Lớp LocationModel (Vị trí Entity) có:

class LocationModel: NSManagedObject { 

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

} 

cách tốt nhất để truy cập và xóa các mục là gì trong thực thể Vị trí? Tôi có nên xóa đối tượng khỏi PersonsModel hoặc thông qua LocationsModel không?

Làm như sau:

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

Điều đó không làm việc vì nó sẽ trả về tất cả các địa điểm, không chỉ là địa điểm cho các đối tượng liên quan đến việc phụ huynh/Người có liên quan. Có phải là một cách đơn giản để làm điều này - có lẽ với vị ngữ?

Ai đó có thể giúp chỉ cho tôi đúng hướng không?

Cảm ơn!

CẬP NHẬT: Đối với những người tương lai có cùng thách thức.

1) Đảm bảo các quy tắc xóa mối quan hệ là chính xác. Trong trường hợp của tôi, tôi muốn có thể xóa các Vị trí nhưng giữ cho Người đó. Các quy tắc cần thiết để xóa được thiết lập như sau: Địa điểm - Xóa Rule: Cascade, Person - Xóa Rule: vô hiệu hóa

2) Các mã cuối cùng trông như thế này:

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

} 

Trả lời

3

Sử dụng các vị từ là hoàn toàn đúng. Bạn muốn thiết lập vị cho fetchRequest

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

Sau đó, bạn có thể xóa các kết quả

0

Làm thế nào về:

locationsArray = personRef.Location 

Tôi nghĩ rằng đó là đơn giản hơn nhiều

Các vấn đề liên quan