首页 > 解决方案 > 尝试保存 CoreData ManageddObject 时崩溃

问题描述

我在尝试像这样保存 CoreData 托管对象时发生了崩溃:

func saveRide(rideDetails details: Ride)  {
        
        
   if managedContext != nil {
            
    let ride = RideDetails(context: managedContext!)
    ride.rideId =  details.rideId
    ride.avgSpeed = Int64(details.avgSpeed ?? 0)
    ride.blindSpotLeft = Int64(details.blindSpotLeft ?? 0)
    ride.blindSpotRight = Int64(details.blindSpotRight ?? 0)
    ride.distance = details.distance ?? 0.0
    ride.distanceKeeping = Int64(details.distanceKeeping ?? 0)
    ride.forwardCollision =  Int64(details.forwardCollision ?? 0)
    ride.maxAngle = details.maxAngle ?? 0.0
    ride.maxSpeed = details.maxSpeed ?? 0.0
            
    var locations :[LocationDetails] = []
    for locationDetails in details.locations {
                
      let location = LocationDetails(context: managedContext!)
      
      location.lat = locationDetails.lat ?? 0.0
      location.lon = locationDetails.lon ?? 0.0
      location.ride = ride
      
      locations.append(location)
    }
            
    if locations.count > 0 {
                
     let locationsSet = NSOrderedSet(array: locations)
     ride.addToLocations(locationsSet)
    }
            
    do {
          try self.managedContext?.save()
    }
    catch let error {
          
      self.delegate?.didFailuredToCompleteTheOperation?(message: error.localizedDescription)
      #if DEBUG
      print("Failed to save:\(error)")
      #endif
    }
      
   }

我在控制台中收到的错误消息是

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFSet addObject:]:尝试插入 nil”

托管对象是:

import Foundation
import CoreData

@objc(RideDetails)
public class RideDetails: NSManagedObject {

}

//
//  RideDetails+CoreDataProperties.swift
//  
//
//  Created by Maria Davidenko on 13/04/2021.
//
//

import Foundation
import CoreData


extension RideDetails {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<RideDetails> {
        return NSFetchRequest<RideDetails>(entityName: "RideDetails")
    }

    @NSManaged public var avgSpeed: Int64
    @NSManaged public var blindSpotLeft: Int64
    @NSManaged public var blindSpotRight: Int64
    @NSManaged public var distance: Float
    @NSManaged public var distanceKeeping: Int64
    @NSManaged public var forwardCollision: Int64
    @NSManaged public var maxAngle: Float
    @NSManaged public var maxSpeed: Float
    @NSManaged public var rideId: String?
    @NSManaged public var timestamp: Date?
    @NSManaged public var locations: NSOrderedSet?

}

// MARK: Generated accessors for locations
extension RideDetails {

    @objc(insertObject:inLocationsAtIndex:)
    @NSManaged public func insertIntoLocations(_ value: LocationDetails, at idx: Int)

    @objc(removeObjectFromLocationsAtIndex:)
    @NSManaged public func removeFromLocations(at idx: Int)

    @objc(insertLocations:atIndexes:)
    @NSManaged public func insertIntoLocations(_ values: [LocationDetails], at indexes: NSIndexSet)

    @objc(removeLocationsAtIndexes:)
    @NSManaged public func removeFromLocations(at indexes: NSIndexSet)

    @objc(replaceObjectInLocationsAtIndex:withObject:)
    @NSManaged public func replaceLocations(at idx: Int, with value: LocationDetails)

    @objc(replaceLocationsAtIndexes:withLocations:)
    @NSManaged public func replaceLocations(at indexes: NSIndexSet, with values: [LocationDetails])

    @objc(addLocationsObject:)
    @NSManaged public func addToLocations(_ value: LocationDetails)

    @objc(removeLocationsObject:)
    @NSManaged public func removeFromLocations(_ value: LocationDetails)

    @objc(addLocations:)
    @NSManaged public func addToLocations(_ values: NSOrderedSet)

    @objc(removeLocations:)
    @NSManaged public func removeFromLocations(_ values: NSOrderedSet)

}

import Foundation
import CoreData

@objc(LocationDetails)
public class LocationDetails: NSManagedObject {

}

import Foundation
import CoreData


extension LocationDetails {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<LocationDetails> {
        return NSFetchRequest<LocationDetails>(entityName: "LocationDetails")
    }

    @NSManaged public var lat: Double
    @NSManaged public var lon: Double
    @NSManaged public var ride: RideDetails?

}

我的猜测是这种关系可以做到,但我之前从未在 CoreData 中处理过关系(仅在 RDBMS 中),所以我正在努力修复它。如果有人知道如何修复它,请帮助,这是错误产生。在此先感谢,玛丽亚。

标签: core-datarelationshipnsmanagedobjectnsmanagedobjectcontext

解决方案


推荐阅读