我有一个工作正常的项目。检查了“核心数据”,并设置了数据模型。我今晚才开始添加几个实体和属性。当我尝试现在运行我的应用程序时,它甚至不会加载。它只是在我身上崩溃了。
这是错误:
'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'
我真的很害怕,因为我没有这个的备份,如果我不能让它工作,我不知道我会做什么。 :)
提前致谢!
修改: 我厌倦了我的数据,所以我只是将一个新的空白xcdatamodel复制到我的项目中,我将重新开始。谢谢您的帮助!
答案 0 :(得分:21)
我的问题是我没有为Entity和Class使用相同的名称。修复它的简单解决方案是给它们相同的名称。
答案 1 :(得分:16)
如果您将 MagicalRecored
与 Swift
一起使用
确保在Swift @objc
子类中使用NSManagedObject
指令使类可以从MagicalRecord库中访问Objective-C代码
@objc(MyEntity)
class MyEntity: NSManagedObject {
@NSManaged var myAttribute: Int16
}
答案 2 :(得分:15)
在搜索了所有解决方案之后,为我修复的是在Xcode中进行清理/构建。
Product-> Clean,Product-> Build,然后尝试运行它。
答案 3 :(得分:12)
我有同样的错误。
对我来说,这是因为我添加了一个新的模型版本,但我没有将其设置为“当前版本”。粗心的我!要修复,请选择xcdatamodel,然后单击设计>数据模型>设置当前版本。然后xcdatamodel文件将有一个绿色勾号。
希望有所帮助。
答案 4 :(得分:11)
好像我的数据被破坏了,所以我在iPhone模拟器中删除了我的数据模型和数据库,并开始新鲜。
答案 5 :(得分:7)
另外,请确保您的.xcdatamodeld文件位于Build Phases的“Copy Bundle Resources”阶段。
答案 6 :(得分:6)
检查是否,
答案 7 :(得分:4)
以下是为我解决的问题:
当我转换为Swift 3时,Xcode在声明一个新的NSFetchRequest
时给了我一个错误,说它需要一个类型。添加类型后,我做了其他任何人都会想到的;如果输入了请求,为什么要指定实体名称?所以,我删除了它。
这实际上是我的错误。
Swift 2.2:
let request = NSFetchRequest(entityName: "MyEntity")
当我第一次转换为Swift 3时:
let request = NSFetchRequest<MyEntity>()
这给了我一个错误。我最终得到了这个:
let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")
一切正常。就个人而言,如果您要输入请求,我不确定为什么需要指定实体名称。也许他们会在某些时候更新(我希望)
答案 8 :(得分:2)
如果您使用的是Swift 3和Core Data的新堆栈语法:
var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MyAppModel")
container.loadPersistentStores(completionHandler: {
(storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
} else {
print(storeDescription)
}
})
return container
}()
然后你应该使用这种获取语法:
let request: NSFetchRequest<Client> = Client.fetchRequest()
在使用不同版本的应用启动后,我在第一次抓取时出现此错误:
let request: NSFetchRequest<NSFetchRequestResult> = Client.fetchRequest()
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Client")
答案 9 :(得分:1)
我建造了干净,并没有解决它。然后我删除了应用程序,但没有解决它。然后我构建了干净并在同一时间删除了应用程序,并修复了它。
答案 10 :(得分:0)
我在苹果开发者论坛上找到了这个解决方案,而这正是我的问题!
解决方案是必须在struct App内部定义上下文。 不在环境参数中
import SwiftUI
@main
struct CoreDataDemoApp: App {
private let context = CoreDataStack.context.
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, context)
}
}
}
答案 11 :(得分:0)
我遇到了同样的问题,实际上我是在叫MyEnty
而不是MyEntity
,所以请重新检查为实体指定的名称并调用相同的名称,还要检查是否在调用相同的属性您已定义为name
答案 12 :(得分:0)
我在第一步进入Core Data(以及iOS 11和Swift 4)时遇到了同样的精确错误。我开始写一本书(第六版旨在针对Swift 4,但可能包括一些遗留的东西)。
正如书中所建议的,我的代码是:
let fetchRequest = NSFetchRequest<ReminderData>()
let entity = ReminderData.entity()
fetchRequest.entity = entity
do {
let rows = try managedObjectContext.fetch(fetchRequest)
} catch {
fatalError("Unresolved error")
}
事实证明,我从ReminderData.entity()
得到的只是nil
。在设置数据模型时不确定我是否做错了什么或... Apple的文档说不能覆盖NSManagedObject.entity()
?
长话短说,Codegen文件ReminderData+CoreDataProperties.swift
确实包含了解决方案:
@nonobjc public class func fetchRequest() -> NSFetchRequest<ReminderData> {
return NSFetchRequest<ReminderData>(entityName: "ReminderDB")
}
这就是我必须使用的最终版本NSFetchRequest
,而不是摆弄NSEntityDescription
,问题就不存在了!
let fetchRequest = NSFetchRequest<ReminderData>(entityName: "ReminderDB")
do {
let rows = try managedObjectContext.fetch(fetchRequest)
} catch {
fatalError("Unresolved error")
}
答案 13 :(得分:0)
也许您正在尝试从不同/错误的捆绑中加载数据库? 例如,来自框架内或框架内?
我遇到了这个问题,并通过从相关框架的bundle
加载数据库来解决它。然后一切正常!
Swift 4 + MagicalRecord:
let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite")
瞧!
答案 14 :(得分:0)
您也可以使用CoraData中的setter方法......只需做这样的事情......
在CustomCoreDataManager.m
上import&#34; ObjectiveRecord.h&#34; 像这样调用init方法
(instancetype)init {
self = [super init];
if(self){
[[CoreDataManager sharedManager] setModelName:@&#34; YourModelName&#34;]; }
回归自我; }
希望这对某人有帮助......
答案 15 :(得分:0)
我认为最初的问题/问题,以及大多数这些答案修复的问题(只是以不同的方式)只是一个非常简单的问题:
无论何时修改核心数据(如添加实体),您都必须删除所有现有数据(如果尚未发布应用),或者在模型中添加新版本。
以为我会发布这个答案,即使这是一个较老的问题,因为这个答案似乎很明显,到目前为止我在上面提到的任何问题或评论中都没有讨论过。
答案 16 :(得分:0)
当我从错误的数据库中取出时,这发生在我身上。我的应用程序有3个sqlite数据库,当然还有3个ManagedObjectContext实例。好吧,我正在向一个方法提交错误的ManagedObjectContext,要求它查询我提交的ManagedObjectContext中不存在的表。使用正确的ManagedObjectContext后,一切都很好。
答案 17 :(得分:0)
首先,我通过管理器下载了应用程序的数据(看看发生了什么)并注意到它让我将它保存在以前的项目名称下。这让我很困惑。所以我退出了XCode 4.6.1,从我的iPhone中删除了应用程序(及其数据),然后又回来了。
这次我收到错误Cannot create an NSPersistentStoreCoordinator with a nil model
。所以我查看了AppDelegate.m文件并更改了URLForResource
方法中的- (NSPersistentStoreCoordinator *) persistentStoreCoodinator
。它被设置为我的应用程序的名称,我将其更改为“模型”以匹配我的Model.xcdatamodeld的名称。
它现在正在运作。
答案 18 :(得分:0)
添加相同的问题。我复制了所有实体。删除数据模型,重新创建一个空数据并将实体粘贴回新数据模型。解决了我的问题。