我正尝试像以前一样从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
}
当触发保存功能时,我没有保存数据的麻烦。但是有获取数据的麻烦。 我的提取方法如下:
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 提取请求必须具有实体。'
我尝试了可以找到的解决方案,目前没有任何效果。 如何解决这个问题?预先感谢。
答案 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>()
因此请尝试此解决方案,并希望它可以与您一起使用^ _ ^。