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

后,我保存的服务,因为它显然是不必要的和有害的。

这确实乞讨的问题,如果我要做另一个事务后,我需要保存上下文和删除将再次发生此错误?

相关问题