加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xcode – 检索实体名称时出现崩溃?

发布时间:2020-12-14 17:51:20 所属栏目:百科 来源:网络整理
导读:当我的应用程序首次启动时,我做了第一次安装配置,它使用CoreData API为我的SQLLite数据库提供来自 JSON文档的数据. 我这样做是首先从我的核心数据堆栈获取对我的托管对象上下文的引用,然后调用一个执行JSON配置的方法.然后我打电话给: ....(JSON conversion
当我的应用程序首次启动时,我做了第一次安装配置,它使用CoreData API为我的SQLLite数据库提供来自 JSON文档的数据.

我这样做是首先从我的核心数据堆栈获取对我的托管对象上下文的引用,然后调用一个执行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然后我试图插入对象时崩溃…

enter image description here

它给出了错误“致命错误:在展开Optional值时意外发现nil”

我没有生成我的NSManagedObjectSublcasses,我自己创建了它们,但我确定我做得正确.我有一种感觉,虽然核心数据没有在应用程序运行时为“练习”拿起我的Model类.这就是实体名称没有返回的原因.所以这是我的模型类的代码:

import UIKit
import CoreData

public 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: String

public 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)
}
}

这是数据模型编辑器中的实体:

enter image description here

什么想法可能会出错?谢谢

解决方法

我有完全相同的问题,使用完全相同的代码(Florian Kugler的核心数据手册).

添加新实体关系后,我的问题出现了,在创建新实体时,实体名称为nil.我通过删除实体并再次重新创建它来修复它.错误消失了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读