
我这样做是首先从我的核心数据堆栈获取对我的托管对象上下文的引用,然后调用一个执行JsON配置的方法.然后我打电话给:
....(JsON conversion)....context.perform { _ = Exercise.insert(into: context,name: exercisename,category: categoryNumber,equipment: equipment,skill: "",primaryMuscle: primaryMuscle,otherMuscles: otherMuscles,info: exerciseDescription,image1: exerciseImage1,image2: exerciseImage2) } 在每次迭代时,我遍历JsON对象,因此它会持久化每个对象.
插入对象的方法是这样的:
public static func insert(into context: NSManagedobjectContext,name: String,category: Int16,equipment: String?,skill: String?,primaryMuscle: String?,otherMuscles: String?,info: String?,image1: String?,image2: String?) -> Exercise { let exercise: Exercise = context.insertObject() exercise.name = name exercise.category = category exercise.info = info exercise.primaryMuscle = primaryMuscle exercise.otherMuscles = otherMuscles exercise.equipment = equipment exercise.skill = skill if image1 != nil { exercise.image1Path = image1 } if image2 != nil { exercise.image2Path = image2 } return exercise} 然后我扩展了NSManagedobjectContext …
extension NSManagedobjectContext {public func insertObject<Object: NSManagedobject>() -> Object where Object: Managed { guard let obj = NSEntityDescription.insertNewObject(forEntityname: Object.entityname,into: self) as? Object else { fatalError("Wrong object type") } return obj}} 这是我对“托管”协议的声明:
public protocol Managed: class,NSFetchRequestResult {static var entityname: String {get}.... }extension Managed where Self: NSManagedobject {public static var entityname: String { return entity().name! } } 我试图从协议扩展中检索entityname然后我试图插入对象时崩溃…
它给出了错误“致命错误:在展开Optional值时意外发现nil”
我没有生成我的NSManagedobjectSublcasses,我自己创建了它们,但我确定我做得正确.我有一种感觉,虽然核心数据没有在应用程序运行时为“练习”拿起我的Model类.这就是实体名称没有返回的原因.所以这是我的模型类的代码:
import UIKitimport CoreDatapublic class Exercise: NSManagedobject {@NSManaged public fileprivate(set) var category: Int16@NSManaged public fileprivate(set) var image1Path: String?@NSManaged public fileprivate(set) var image2Path: String?@NSManaged public fileprivate(set) var equipment: String?@NSManaged public fileprivate(set) var info: String?@NSManaged public fileprivate(set) var skill: String?@NSManaged public fileprivate(set) var primaryMuscle: String?@NSManaged public fileprivate(set) var otherMuscles: String?public static let normalizednameKey = "name_normalized"@NSManaged fileprivate var primitivename: Stringpublic var name: String { set { willChangeValue(forKey: #keyPath(Exercise.name)) primitivename = newValue updatenormalizedname(newValue) dIDChangeValue(forKey: #keyPath(Exercise.name)) } get { willAccessValue(forKey: #keyPath(Exercise.name)) let value = primitivename dIDAccessValue(forKey: #keyPath(Exercise.name)) return value }}fileprivate func updatenormalizedname(_ name: String) { setValue(name.normalizedForSearch,forKey: Exercise.normalizednameKey)}public var exerciseImage1: UIImage? { guard let image = image1Path else {return nil} return UIImage(named: image)}public var exerciseImage2: UIImage? { guard let image = image2Path else {return nil} return UIImage(named: image)} public static func insert(into context: NSManagedobjectContext,image2: String?) -> Exercise { let exercise: Exercise = context.insertObject() exercise.name = name exercise.category = category exercise.info = info exercise.primaryMuscle = primaryMuscle exercise.otherMuscles = otherMuscles exercise.equipment = equipment exercise.skill = skill if image1 != nil { exercise.image1Path = image1 } if image2 != nil { exercise.image2Path = image2 } return exercise}} extension Exercise: Managed { public static var defaultSortDescriptors: [NSSortDescriptor] { return [NSSortDescriptor(key: #keyPath(name),ascending: false)] }public static func defaultPredicate(musclecategory: Int) -> nspredicate { return nspredicate(format: "%K == %ld",#keyPath(Exercise.category),musclecategory)}} 这是数据模型编辑器中的实体:
什么想法可能会出错?谢谢
解决方法 我有完全相同的问题,使用完全相同的代码(Florian Kugler的核心数据手册).添加新实体关系后,我的问题出现了,在创建新实体时,实体名称为nil.我通过删除实体并再次重新创建它来修复它.错误消失了.
总结以上是内存溢出为你收集整理的xcode – 检索实体名称时出现崩溃?全部内容,希望文章能够帮你解决xcode – 检索实体名称时出现崩溃?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)