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

의 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 서비스를 설정하고자하기 때문에, 나는 NSMergeByPropertyObjectTrumpMergePolicy을 사용하고 있습니다, 그래서 같은 ID로 새로운 서비스를 만들 때 그냥 덮어 쓰기한다 내 이해가 맞으면 이전 서비스의 데이터. 이것이 문제가 될 수 있습니까? 그렇다면 어떻게 해결할 수 있습니까?

답변

2

나는 당신의 노력으로 몇 가지 문제점을 발견했습니다.

먼저 엔티티 이름을 수정해야한다고 생각합니다. 단일 유형이어야합니다.

예를 들어 "작업 영역"또는 "그림"을 사용했습니다. "Workorder"및 "Picture"여야합니다.

그리고 가장 중요한 문제는 올바른 관계를 설정하기 전에 managedObjects를 동기화한다는 것입니다.

예를 들어 하나의 서비스 개체를 만들었고 해당 작업 순서 관계가 아직 없음입니다. 이 시점에서 컨텍스트를 저장했습니다. 옵션 관계가있는 경우에 발생할 수 있습니다.

그리고 workorder 개체를 만들고 기존 서비스를 해당 관계에 바인딩합니다.

핵심 데이터는 새 작업 순서를 서비스 대상의 작업 순서 관계에 바인드하려고 시도합니다.

그래서 한 번의 트랜잭션으로 처리해야합니다. 마지막으로 설정 관계를 완료 한 후에 컨텍스트를 한 번 저장해야한다는 의미입니다.

서비스 용 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") 
       } 

나는 서비스를 저장 한 후.

이렇게하면 컨텍스트를 저장하고이 오류가 다시 발생해야하는 곳에서 다른 트랜잭션을 수행해야하는지 여부가 궁금합니다.