将 google 对象保存到 Core Data - 以 NSException 错误类型的未捕获异常终止

Posted

技术标签:

【中文标题】将 google 对象保存到 Core Data - 以 NSException 错误类型的未捕获异常终止【英文标题】:Saving google places objects to Core Data - terminating with uncaught exception of type NSException error 【发布时间】:2016-12-29 14:56:32 【问题描述】:

我正在尝试使用 CoreData 来保存和检索用户通过使用自动完成小部件在 Google 地图上标记的标记。但是,我不断收到“libc++abi.dylib:以 NSException 类型的未捕获异常终止”错误,并且不确定这是为什么或意味着什么?当我尝试将对象存储到核心数据中时会发生这种情况。

下面是相关代码:

    func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) 
    self.place = place
    let camera = GMSCameraPosition.camera(withLatitude: place.coordinate.latitude, longitude: place.coordinate.longitude, zoom: 15.0)
    self.vwGMap.camera = camera
    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(place.coordinate.latitude, place.coordinate.longitude)
    marker.title = place.name
    marker.snippet = place.formattedAddress
    marker.map = self.vwGMap
    marker.icon = GMSMarker.markerImage(with: UIColor.blue)
    marker.tracksViewChanges = true
    self.dismiss(animated: true, completion: nil)
    print("Place name: ", place.name)
    print("Place address: ", place.formattedAddress)
    print("Place placeID: ", place.placeID)
    print("Place attributions: ", place.attributions)
    print("Place Coordinate:", place.coordinate)
    //The printing only happens in the terminal

    let newPlaceName = place.name
    self.newPlaceName = place.name
    let newPlaceAddress = place.formattedAddress
    self.newPlaceAddress = place.formattedAddress!
    let newPlacePlaceID = place.placeID
    self.newPlacePlaceID = place.placeID

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let newPlace = NSEntityDescription.insertNewObject(forEntityName: "StoredPlace", into: context)

    newPlace.setValue(newPlaceName, forKeyPath: "name")
    newPlace.setValue(newPlaceAddress, forKeyPath: "address")
    newPlace.setValue(newPlacePlaceID
        , forKeyPath: "placeID")

    do
    
        try context.save()
        print("SAVED")
    
    catch
    
        //PROCESS ERROR
    



也许我应该将 let appDelegate 等放入 viewDidLoad 但我最终得到了同样的致命错误。

我在 StoredPlace 实体中将名称、地址、placeID 设置为“字符串”类型的属性。

关于错误的更多信息: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+entityForName:nil 不是搜索实体名称“StoredPlace”的合法 NSManagedObjectContext 参数 *** 首先抛出调用栈:

这个错误是什么意思,我该如何解决?

【问题讨论】:

【参考方案1】:

您的核心数据方法在哪里?在这个 ViewController 或 AppDelegate 中?

【讨论】:

这是视图控制器。我将更新帖子以显示 AppDelegate 方法。我正在使用最新版本的 Xcode 和 Swift 哦,天哪,感谢您的提问,因为我忘记更改容器名称以匹配我的 xcdatamodel,因为我在创建它后重命名了它......【参考方案2】:

我现在已经解决了这个问题,这很愚蠢,但很容易犯这样的错误,仅供参考。如果在创建 xcdatamodel 之后重命名它,不要忘记在声明容器的 Appdelegate 中更改它。所以'let container = NSPersistentContainer(name: "YOUR RENAMED FILE")',否则会出现上述错误!

【讨论】:

以上是关于将 google 对象保存到 Core Data - 以 NSException 错误类型的未捕获异常终止的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RestKit 中保存到 Core Data RKMappingResult 对象?

Core Data 对象有时不会保存到永久存储中

将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃

我应该多久保存到 Core Data?

iPhone Core Data 对象添加到 NSMutableArray

在 Core Data 中只保存部分对象