次のコードがあります。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")
Aのworkordersは、私はそれがこのように見えるサービスオブジェクトを参照する必要があり
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?
}
私は削除コードIを実行
ワークオーダーのモデルで を削除ルールとして無効にする ...(下の画像を参照)ただし、バッチ削除を実行するとサービスが正しく無効化されないようです。私はそれがでクラッシュWorkOrderは上に新しいサービスを設定しようとすると...
のlibC++ abi.dylib:タイプNSExceptionのキャッチされない例外で
を終了私はこれが原因の場合であると確信しています削除ルールをワークスペーダーにカスケードするように設定した場合は、問題が修正されます。しかし、私は古いサービスをそのまま参照を無効にしておきたい。
クラッシュすることなく、新しいサービスをワークオーダーに設定できないのはなぜですか?
以下は、コンソールメッセージを見てクラッシュするコードの部分です。私はサービスを設定しようとする瞬間にそれを絞りました。
また、私は再びWorkOrderはに同じIDサービスを設定しようとするので、私は同じIDを持つ新しいサービスを作成するとき、それは単に上書きしなければならないので、私はNSMergeByPropertyObjectTrumpMergePolicyを使用しています、注意してください私の理解が正しいならば古いサービスのデータ。これが問題になるかもしれません、もしそうなら、どうすれば修正できますか?