CoreData获取已删除的托管对象

时间:2018-12-19 09:48:21

标签: ios swift xcode

我有一个FileSystem类,用于管理托管对象的所有保存和提取。我写了下面的函数从托管上下文中删除项目

func deleteTaxFile(fileToDelete: TaxFile) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }

    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: EntityNames.taxFiles.rawValue)

    if let result = try? managedContext.fetch(fetchRequest)  {
        for object in result {
            if TaxFile(taxFile: object) == fileToDelete {
                managedContext.delete(object)
            }
        }
    }

    do {
        try managedContext.save()
    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }

}

EntityNames.taxFile.rawValue只是我的托管对象(“ TaxFile”)的枚举名称

我还有一个表视图,其中列出了其中一些文件。

我想在表视图上实现删除功能,该功能从表视图中删除项目。下面是我对表格视图删除功能的实现。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        fileSystem.deleteTaxFile(fileToDelete: taxFiles[indexPath.item])
        setupData()
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

列出的setupData()方法如下所示

    func setupData() {

    let error = fileSystem.debugger {
        try self.taxFiles = self.fileSystem.getOwnersTaxFiles(owner: self.appDelegate.profile!.getUserName())
    }

    if (error != nil) {
        print("Error with Claims screen, setupData method. Error: \(String(describing: error))")
    }

    calculator = TaxCalculator(profile: appDelegate.profile!)
    claimsTableView.delegate = self
    claimsTableView.dataSource = self
    claimsTableView.reloadData()
    totalClaimsLabel.text = "Total claimed: \(String(describing: calculator!.getTotalToBeClaimed()))"
}

fileSystem.getOwnersTaxFiles()看起来像这样

 func getOwnersTaxFiles(owner: String) throws -> [TaxFile] {
    fetch(.taxFiles)
    var result = [TaxFile]()

    if (taxFiles.count == 0 ) {
        throw FileSystemErrors.taxFileNotFound
    } else {
        for taxFile in taxFiles {
            if (taxFile.getOwner() == owner) {
                result.append(taxFile)
            }
        }
    }

    return result
}

最后,fetch()方法如下所示

 private func fetch(_ entity: EntityNames) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }

    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity.rawValue)

    do {
        if entity.rawValue == "Profile" {
            managedProfiles = try managedContext.fetch(fetchRequest)
            convertManagedObjects(to: .userProfile)
        } else if entity.rawValue == "TaxFile" {
            managedTaxFiles = try managedContext.fetch(fetchRequest)
            convertManagedObjects(to: .taxFile)
        }

    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}

到目前为止,所有获取方法都可以正常工作。但是,当我从托管上下文中删除对象时,该对象将被确定删除(当我使用TaxCaculator类获取它时,文件将被删除),但是当我使用任何其他类获取对象时,删除的对象仍然保留。

重要说明:应用重新启动后,不会获取文件。因此,当我终止该应用程序并重新启动时,不会提取已删除的文件。

有人能弄清楚这里发生了什么吗?如果您认为您需要更多我的代码,请告诉我。

0 个答案:

没有答案