无法访问 CoreData

Posted

技术标签:

【中文标题】无法访问 CoreData【英文标题】:Unable to access CoreData 【发布时间】:2017-10-29 18:56:54 【问题描述】:

我正在开发一个正在运行的应用程序,由于某种原因,当我尝试访问数据以将其映射出来时出现错误 sudo gem install cocoapods-deintegrate cocoapods-clean

致命错误:在展开可选值时意外发现 nil

线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 在下一行

let locations = run.locations

如果我把它改成

let locations = run?.locations

我在应用程序中收到“else”消息,但它没有崩溃。

我知道数据在那里,因为我与 Liya 确认了它。不知道为什么我的应用看不到它。

下面是剩下的代码

    var run : Run!

    func loadMap() 
    guard
        let locations = run.locations,
        locations.count > 0,
        let region = mapRegion()
        else 
            let alert = UIAlertController(title: "Error",
                                          message: "Sorry, this run has no locations saved",
                                          preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .cancel))
            present(alert, animated: true)
            return
    
    print("loadMap")
    mapView.setRegion(region, animated: true)

    mapView.add(polyLine())

TIA

【问题讨论】:

您已将run 声明为隐式展开的可选项,但您需要为其实际分配一个值,否则它将是nil。你在哪里从 Core Data 获取数据并赋值? 请原谅这个愚蠢的问题,因为我真的很陌生,但这不是第一行在做什么吗?如果我在那之后尝试调用 run,.locations 和所有其他属性都会出现 不,该行只是声明了一个 Run! 类型的变量 run(隐式展开的可选 Run)。您需要将Run 的实例实际分配给该变量,否则它将是nil;这就是为什么你在使用时会崩溃的原因!但不是当你有条件地用 ? 解开它时。您需要对 Core Data 执行 fetch 以检索以前保存的 Run 对象并将其分配给该属性。 【参考方案1】:

布埃诺!谢谢。

好的。所以这里是

已删除

    var run : Run!

声明一个空数组,因为 fetch 返回 [Any]

    var locations : [Any] = [] 

添加代理

let appDelegate = UIApplication.shared.delegate as? AppDelegate

然后将获取数据函数编写为带有完成处理程序的扩展

extension MapsViewController 
func fetch(completion: (_ complete: Bool) -> ()) 
    guard let managedContext = appDelegate?.persistentContainer.viewContext else  return 

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Location")

    do
        locations = try managedContext.fetch(fetchRequest) //Trys to call CoreData and returns an Array of type [Any] and assigns them to the array of locations
        print("fetched data")
        completion(true)

     catch 
        debugPrint("could not fetch: \(error.localizedDescription)")
        completion(false)
    

【讨论】:

以上是关于无法访问 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

获取对象时无法访问一对多CoreData关系

通过UserNotification自定义操作访问时,CoreData无法初始化托管对象

Core Data 无法生成原始访问器

添加新属性时,CoreData 无法完成错误

SwiftUI/CoreData:同时访问0x7f92efc61cb8,但修改需要独占访问

具有核心数据关系的 iOS 8 Swift NSFetchResult 谓词无法访问内部 ID