2016-11-12 64 views
1

我有以下代碼。如何獲取NSBatchDeleteRequest以刪除並允許您再次添加回對象

let workorderFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Workorders") 
       let deleteWorkOrderRequest = NSBatchDeleteRequest(fetchRequest: workorderFetchRequest) //Deletes ALL workorders 

       //Question is will it delete all references to the work orders correctly now? 
       try context.execute(deleteWorkOrderRequest) 

       //Save the work order objects (overwriting any old ones with same id if needed) 
       do { 
        try context.save() 
        print("Saved context with workorders") 
       } catch let error as NSError { 
        print("Could not save \(error), \(error.userInfo)") 
       } catch { 
        print("Could not save, unknown error") 
       } 

       print("deleted references") 

一個工作訂單看起來像這樣...

import Foundation 
import CoreData 

extension Workorders { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Workorders> { 
     return NSFetchRequest<Workorders>(entityName: "Workorders"); 
    } 

    @NSManaged public var address: String? 
    @NSManaged public var client_id: Int64 
    @NSManaged public var desc: String? 
    @NSManaged public var id: Int64 
    @NSManaged public var phone: String? 
    @NSManaged public var signaturepath: String? 
    @NSManaged public var lat: String? 
    @NSManaged public var lng: String? 
    @NSManaged public var service: Service? 
    @NSManaged public var pictures: NSSet? 
    @NSManaged public var videos: NSSet? 

} 

// MARK: Generated accessors for pictures 
extension Workorders { 

    @objc(addPicturesObject:) 
    @NSManaged public func addToPictures(_ value: Pictures) 

    @objc(removePicturesObject:) 
    @NSManaged public func removeFromPictures(_ value: Pictures) 

    @objc(addPictures:) 
    @NSManaged public func addToPictures(_ values: NSSet) 

    @objc(removePictures:) 
    @NSManaged public func removeFromPictures(_ values: NSSet) 

} 

// MARK: Generated accessors for videos 
extension Workorders { 

    @objc(addVideosObject:) 
    @NSManaged public func addToVideos(_ value: Videos) 

    @objc(removeVideosObject:) 
    @NSManaged public func removeFromVideos(_ value: Videos) 

    @objc(addVideos:) 
    @NSManaged public func addToVideos(_ values: NSSet) 

    @objc(removeVideos:) 
    @NSManaged public func removeFromVideos(_ values: NSSet) 

} 

我把它引用看起來像這樣的一個服務對象......

import Foundation 
import CoreData 

extension Service { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Service> { 
     return NSFetchRequest<Service>(entityName: "Service"); 
    } 

    @NSManaged public var id: Int64 
    @NSManaged public var name: String? 
    @NSManaged public var templatedata: String? 
    @NSManaged public var workorder: Workorders? 

} 

當我運行刪除代碼我在工作模式上設置爲Nullify作爲刪除規則 ...(參見下圖)

enter image description here

當我運行批量刪除,但它似乎並沒有正確無效的服務。當我嘗試設置一個新的服務到它...崩潰的工作單

的libC++ abi.dylib:與類型的未捕獲的異常終止NSException

我敢肯定,這是這種情況,因爲如果我將刪除規則設置爲在工作單上級聯,那麼它將修復問題。但是,我想保留舊的服務只是取消參考。

爲什麼我不能在沒有崩潰的情況下將新服務設置到工作單上?

下面附加的是它通過查看控制檯消息而崩潰的代碼區域,我將其縮小到我嘗試設置服務的那一刻。

enter image description here

另外請注意,我使用的是NSMergeByPropertyObjectTrumpMergePolicy,因爲我打算再設定相同的ID服務工作單,所以當我創建一個新的服務具有相同ID它應該只是覆蓋如果我的理解是正確的,舊服務的數據。這可能是問題,如果是的話,我該如何解決它?

回答

2

我從你的嘗試中發現一些問題。

起初,我認爲你需要修改實體名稱。他們應該是單一類型。

例如,您使用「工作訂單」或「圖片」他們。 它應該是「Workorder」和「Picture」。

和主要的問題是,你之前,你設置正確的關係,同步managedObjects。

例如,您創建一個服務對象和它的工作單的關係是零呢。 在這一點上,你保存了上下文。 如果您有可選關係,可能會發生這種情況。

你創建工作單的對象和現有服務綁定到它的關係。

核心數據試圖綁定新工作單到工作單服務對象反之亦然的關係。

所以應該在一個事務中來完成。 最後,這意味着您在完成設置關係後需要保存上下文。

所以刪除saveContext行服務。

比方說,你做到了,你現在這樣。 使用新服務保存上下文後,您創建了workorder1併爲其關係設置了服務。然後應用程序崩潰或被某物阻止。 在這些情況下會導致數據完整性問題。

我希望這將有助於您瞭解這個問題並解決它。

乾杯!

1

好吧,我驚訝地發現我的問題的答案。

它看起來你不必早於一個對象提前保存上下文以供其他人蔘考,實際上......你不應該!

這樣做顯然使nsbatchdelete不同步。我不知道如何和會比我自己更好的答案,爲什麼這會修復它。

總之我擺脫了早期的...

do { 
        try context.save() 
        print("Saved context with workorders") 
       } catch let error as NSError { 
        print("Could not save \(error), \(error.userInfo)") 
       } catch { 
        print("Could not save, unknown error") 
       } 

後,我保存的服務,因爲它顯然是不必要的和有害的。

這確實乞討的問題,如果我要做另一個事務後,我需要保存上下文和刪除將再次發生此錯誤?

相關問題