Macos SWIFT OS X-从持久存储中删除托管对象:致命错误

Macos SWIFT OS X-从持久存储中删除托管对象:致命错误,macos,swift,core-data,nsmanagedobject,Macos,Swift,Core Data,Nsmanagedobject,我正在使用下面的函数从持久存储中删除托管对象。 删除功能是: func deletePPRRowDataManagedObject(date: NSDate) { let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(self.pprRowEntity, inManagedObjectContext: self.managedObjectContext!) as! PPRRowData

我正在使用下面的函数从持久存储中删除托管对象。 删除功能是:

 func deletePPRRowDataManagedObject(date: NSDate) {

    let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(self.pprRowEntity, inManagedObjectContext: self.managedObjectContext!) as! PPRRowData
    var pprRowDataArray = self.fetchPPRRowDataManagedObjects()
    let filteredPPRRowDataArray = pprRowDataArray.filter({$0.pprDate == date})
    for object in filteredPPRRowDataArray {

        managedObjectContext?.deleteObject(object)
    }

    var pprFileDataArray =  self.fetchPPRFileDataManagedObjects()
    let filteredPPRFileDataArray = pprFileDataArray.filter({$0.pprDate == date})
    for object in filteredPPRFileDataArray {

        managedObjectContext?.deleteObject(object)
    }

    var error: NSError? = nil
    if !managedObjectContext!.save(&error) {

        //  this code needs to be replaced to properly deal with the error
        abort()
    }
}
我有三个子类的核心数据实体,在这段代码中,我试图从持久存储中删除其中两个的托管对象

这三个实体之间没有定义任何关系。所有三个都保存在同一个托管对象上下文和同一个持久存储中

删除托管对象后,我可以从持久存储中创建和获取数据,而不会出现运行时错误。我可以从第三个实体访问数据,但现在当我尝试访问从fetch创建的数据数组时,会出现数据错误。。。。。从持久性存储中为我已删除某些托管对象的两个实体生成托管对象的函数

从持久存储中获取数据的代码(如下)运行时没有错误。错误

(EXC错误访问(代码=1,地址=0x0)错误)

在尝试访问输出阵列时发生

     let outputArray = addDataFiles.fetchPPRRowDataManagedObjects()
当我在任何删除之前运行代码时,它运行起来没有任何问题

如果您对可能导致错误的原因有任何想法/指导,我们将不胜感激。我无法确定我用于删除托管对象或相关获取的代码是否有问题。。。我正在使用的函数

以下是其中一个获取的示例。。。我正在使用的函数:

func fetchPPRRowDataManagedObjects() ->Array<PPRRowData>{

    let fetchRequestPPRRowData = NSFetchRequest()
    let entityPPRRowData = NSEntityDescription.entityForName(self.pprRowEntity, inManagedObjectContext: self.managedObjectContext!)
    var resultsArrayPPRRowData: Array<PPRRowData> = []
    var arrayFetchResults: Array<AnyObject> = []
    fetchRequestPPRRowData.entity = entityPPRRowData
    var error: NSError? = nil
    arrayFetchResults = managedObjectContext!.executeFetchRequest(fetchRequestPPRRowData, error: &error)!
    for index in arrayFetchResults {

        resultsArrayPPRRowData.append(index as! PPRRowData)
    }
    return resultsArrayPPRRowData
}
func fetchpprowDataManagedObjects()->数组{
让fetchrequestpprowdata=NSFetchRequest()
让EntityPrrowData=NSEntityDescription.entityForName(self.pprowEntity,inManagedObjectContext:self.managedObjectContext!)
var resultsarraypprowdata:Array=[]
var arrayFetchResults:Array=[]
FetchRequestPProwData.entity=EntityPrrowData
变量错误:n错误?=nil
arrayFetchResults=managedObjectContext!.executeFetchRequest(FetchRequestPProwData,错误:&错误)!
对于arrayFetchResults中的索引{
resultsarraypprowdata.append(索引为!pprowdata)
}
返回结果ArrayPrrowData
}

好的-经过大量的代码测试,我发现这个问题是错误的!managedObjectContext!。save()语句,该语句在我迭代代码时在循环中触发-在createManagedObject()函数和我创建的.deleteManagedObject()函数中都是如此。甚至不知道它为什么会在那里(也就是说,为什么我首先把它放在那里),但它显然是在制造问题


Marcus,非常感谢您的耐心和建议,这让我更仔细地检查了我的代码,并最终确定了问题所在Wolfstar 1小时前

好-经过大量代码测试,我发现问题是错误的!managedObjectContext!。save()语句,该语句在我迭代代码时在循环中触发-在createManagedObject()函数和我创建的.deleteManagedObject()函数中都是如此。甚至不知道它为什么会在那里(也就是说,为什么我首先把它放在那里),但它显然是在制造问题


Marcus,非常感谢您的耐心和建议,这让我更仔细地检查了我的代码,并最终确定了问题所在Wolfstar 1小时前

确切错误是什么?而且,当您获取时,您根本没有看到该错误。很可能您在获取时遇到错误,并且没有对其进行处理。您也没有在保存失败时打印出错误。至少调用
print(“Error:\(Error)”)
会让您知道发生了什么事情。我已经包含了建议的错误代码。对于两次获取,我都没有在保存时引发错误。。或删除。。唯一发生的事情是,在删除一些托管对象后,当我尝试访问outputArray时,出现EXC_BAD_ACCESS(代码=1,地址=0x0)错误。您将哪个数组称为输出数组?是否尝试访问以前删除的对象?deletePPR。。。。。上面的函数应该过滤掉,然后只删除一些托管对象。调用该函数后,我将调用fetchPPR。。。函数,并根据上面文本中包含的let语句将resultsArrayPRRowData返回到outputArray。在这之后,当我在for-in循环中访问outputArray时,我得到了错误的访问错误。如果我没有删除任何内容,那么访问代码工作正常,我可以访问outputArray而不会出现任何问题。确切的错误是什么?而且,当您获取时,您根本没有看到该错误。很可能您在获取时遇到错误,并且没有对其进行处理。您也没有在保存失败时打印出错误。至少调用
print(“Error:\(Error)”)
会让您知道发生了什么事情。我已经包含了建议的错误代码。对于两次获取,我都没有在保存时引发错误。。或删除。。唯一发生的事情是,在删除一些托管对象后,当我尝试访问outputArray时,出现EXC_BAD_ACCESS(代码=1,地址=0x0)错误。您将哪个数组称为输出数组?是否尝试访问以前删除的对象?deletePPR。。。。。上面的函数应该过滤掉,然后只删除一些托管对象。调用该函数后,我将调用fetchPPR。。。函数,并根据上面文本中包含的let语句将resultsArrayPRRowData返回到outputArray。在这之后,当我在for-in循环中访问outputArray时,我得到了错误的访问错误。如果我没有删除任何内容,访问代码工作正常,我可以访问outputArray而不会出现任何问题。