2016-11-12 3 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") 

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を実行

ワークオーダーのモデルで を削除ルールとして無効にする ...(下の画像を参照)

enter image description here

ただし、バッチ削除を実行するとサービスが正しく無効化されないようです。私はそれがでクラッシュWorkOrderは上に新しいサービスを設定しようとすると...

のlibC++ abi.dylib:タイプNSExceptionのキャッチされない例外で

を終了私はこれが原因の場合であると確信しています削除ルールをワークスペーダーにカスケードするように設定した場合は、問題が修正されます。しかし、私は古いサービスをそのまま参照を無効にしておきたい。

クラッシュすることなく、新しいサービスをワークオーダーに設定できないのはなぜですか?

以下は、コンソールメッセージを見てクラッシュするコードの部分です。私はサービスを設定しようとする瞬間にそれを絞りました。

enter image description here

また、私は再びWorkOrderはに同じIDサービスを設定しようとするので、私は同じIDを持つ新しいサービスを作成するとき、それは単に上書きしなければならないので、私はNSMergeByPropertyObjectTrumpMergePolicyを使用しています、注意してください私の理解が正しいならば古いサービスのデータ。これが問題になるかもしれません、もしそうなら、どうすれば修正できますか?

答えて

2

私はあなたの試みからいくつかの問題を見つけます。

まず、エンティティ名を変更する必要があると思います。それらはシングルタイプでなければなりません。

たとえば、「ワークステーション」または「写真」を使用しました。 "Workorder"と "Picture"である必要があります。

そして、主な問題は、正しい関係を設定する前にmanagedObjectsを同期させることです。

たとえば、1つのサービスオブジェクトを作成し、そのワークオーダー関係がまだnilではありません。 この時点で、コンテキストを保存しました。 オプションの関係があった場合に起こります。

あなたはworkorderオブジェクトを作成し、既存のサービスをその関係にバインドしました。

コアデータは、新しいワークオーダーをサービスオブジェクトのワークオーダー関係にバインドしようとします。

したがって、1つのトランザクションで実行する必要があります。 最後に、設定の完了後にコンテキストを一度保存​​する必要があることを意味します。

サービス用の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") 
       } 

は私がサービスを保存した後。

これは私がコンテキストを保存し、このエラーが再び発生する削除する必要がある後に別のトランザクションを行うことでしたか?

関連する問題