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

时间:2015-07-15 13:23:50

标签: macos swift core-data nsmanagedobject

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

 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_BAD_ACCESS(code = 1,address = 0x0)error)

当我尝试访问outputArray时发生

     let outputArray = addDataFiles.fetchPPRRowDataManagedObjects()

当我在任何删除之前运行代码时,它运行没有任何问题。

任何有关可能产生错误的想法/指导都将不胜感激。我无法确定我使用的代码是否存在删除托管对象或我正在使用的相关提取...功能的问题。

以下是我正在使用的一个fetch ...函数的示例:

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
}

1 个答案:

答案 0 :(得分:0)

好的 - 经过大量的代码测试后,我发现问题是一个错误的!managedObjectContext!.save()语句,当我在代码中迭代时,它在循环中触发 - 在createManagedObject()函数和在我创建的.deleteManagedObject()函数中。甚至不确定它为什么存在(也就是说,为什么我把它放在那里)但它显然是在创造问题。

马库斯,非常感谢您的耐心和建议,这让我更仔细地审查了我的代码并最终确定了问题。 - Wolfstar 1小时前