iOS 13,有关转换属性的CoreData崩溃

时间:2019-10-02 12:58:26

标签: ios core-data

我正尝试像以前一样从Core Data加载文件。 我的CoreData堆栈如下:

import Foundation
import CoreData

class SaveData:NSObject {



lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "DataModel")
    container.loadPersistentStores(completionHandler: {
    storeDescription, error in
    if let error = error {
        fatalError("Could load data store: \(error)")     }   })
    return container }()


lazy var managedObjectContext: NSManagedObjectContext = persistentContainer.viewContext

}

我的数据模型: enter image description here

当触发保存功能时,我没有保存数据的麻烦。但是有获取数据的麻烦。 我的提取方法如下:

var saveData = SaveData()

var locations = [Location]()

override func viewDidLoad() {
    super.viewDidLoad()

    let fetchRequest = NSFetchRequest<Location>()   // 2
    let entity = Location.entity()
    fetchRequest.entity = entity   // 3
    let sortDescriptor = NSSortDescriptor(key: "date", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    do {
        locations = try saveData.managedObjectContext.fetch(fetchRequest)
    } catch {
        fatalCoreDataError(error)
    }

}
  

从CoreData获取数据时,应用程序崩溃。调试区域   说:2019-10-02 20:44:29.780267 + 0800 MyLocation [20870:2214196]   [错误]错误:在任何模型中,没有NSEntityDescriptions声明   NSManagedObject子类'Location',所以+ entity感到困惑。有你吗   加载了您的NSManagedObjectModel了吗? CoreData:错误:否   任何模型中的NSEntityDescriptions都声明NSManagedObject子类   “位置”,因此+实体感到困惑。你装好了吗   NSManagedObjectModel了吗? 2019-10-02 20:44:29.780387 + 0800   MyLocation [20870:2214196] [错误]错误:+ [位置实体]失败   查找NSEntityDescription与托管对象的唯一匹配   子类CoreData:错误:+ [位置实体]找不到唯一   匹配NSEntityDescription到托管对象子类   2019-10-02 20:44:29.789644 + 0800 MyLocation [20870:2214196] ***   由于未捕获的异常而终止应用程序   'NSInvalidArgumentException',原因:'executeFetchRequest:错误:A   提取请求必须具有实体。'

我尝试了可以​​找到的解决方案,目前没有任何效果。 如何解决这个问题?预先感谢。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。

首先,我在托管对象上声明了一个名为fetchRequest()的方法,

  extension OrderType {
        @nonobjc public class func fetchRequest() -> NSFetchRequest<OrderType> {
            return NSFetchRequest<OrderType>(entityName: "OrderType")
        }
        @NSManaged public var orderType: String?
        @NSManaged public var orderTypeId: Int32
        @NSManaged public var order: NSSet?
    }

该应用在此行崩溃:

let itemCount = try managedObjectContext.count(for: OrderType.fetchRequest())

为了解决此应用崩溃问题,我将fetchRequest()更改为fetchRequest2()之类的其他名称,崩溃消失了!

此解决方案之所以有效,是因为在CoreData本身中声明了一个具有相同名称的方法:

/* A new fetch request initialized with the Entity represented by this subclass. This property's getter is only legal to call on subclasses of NSManagedObject that represent a single entity in the model.
 */
@available(iOS 10.0, *)
open class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>

当我像您一样创建fetchRequest时,应用程序崩溃也发生了:

let fetchRequest = NSFetchRequest<OrderType>()  

因此请尝试此解决方案,并希望它可以与您一起使用^ _ ^。