代码之家  ›  专栏  ›  技术社区  ›  sudo rm -rf

executeFetchRequest:错误:获取请求必须具有实体

  •  20
  • sudo rm -rf  · 技术社区  · 14 年前

    我有个项目进展顺利。它检查了“核心数据”,并建立了所有的数据模型。我今晚才开始添加一些实体和属性。当我现在尝试运行我的应用程序时,它甚至不会加载。它突然撞到我身上。

    错误如下:

    'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'

    我真的很害怕,因为我没有备份,如果我不能让它工作,我不知道我会做什么。:)

    提前谢谢!

    编辑: 我受够了我的数据,所以我刚刚复制了一个新的空白xcdatamodel到我的项目中,我将重新开始。谢谢你的帮助!

    18 回复  |  直到 14 年前
        1
  •  21
  •   syshen    11 年前

    我的问题是实体和类没有使用相同的名称。解决这个问题的简单方法是给它们起相同的名字。

        2
  •  16
  •   Warif Akhand Rishi    9 年前

    如果你正在使用 MagicalRecored 具有 Swift :

    一定要用 @objc Swift指令 NSManagedObject 子类,使类可从MagicalRecord库访问Objective-C代码

    @objc(MyEntity)
    class MyEntity: NSManagedObject {
        @NSManaged var myAttribute: Int16
    }
    
        3
  •  15
  •   Jake Stoeffler    13 年前

    在到处寻找解决方案之后,为我修复它的是在Xcode中进行一次清理/构建。

    产品->干净,产品->生成,然后尝试运行它。

        4
  •  12
  •   samwize    14 年前

    我也犯了同样的错误。

    对我来说,这是因为我添加了一个新的模型版本,但我没有将其设置为“当前版本”。我太粗心了!若要修复,请选择xcdatamodel,单击“设计”>“数据模型”>“设置当前版本”。然后xcdatamodel文件将有一个绿色的勾号。

    希望能有所帮助。

        5
  •  11
  •   sudo rm -rf    14 年前

    似乎我的数据被破坏了,所以我删除了我的数据模型和iPhone模拟器中的数据库,重新开始。

        6
  •  8
  •   uff da    11 年前

    另外,请确保.xcdatamodeld文件处于构建阶段的“复制捆绑资源”阶段。

        7
  •  6
  •   aToz    11 年前

    检查是否,

    • 该实体存在于xcdatamodel文件中。
    • 使用的实体名称相同。
        8
  •  4
  •   Simon Germain    8 年前

    以下是为我修复的:

    当我转换到Swift 3时,Xcode在声明一个新的 NSFetchRequest ,说它需要一种类型。在添加了类型之后,我做了其他人应该做的事情;如果请求是类型化的,为什么要指定实体名?所以,我把它拿走了。

    其实是我的错。

    银行代码2.2:

    let request = NSFetchRequest(entityName: "MyEntity")
    

    当我第一次转换为Swift 3时:

    let request = NSFetchRequest<MyEntity>()
    

    这给了我一个错误。我的结局是:

    let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")
    

    一切都很好。就我个人而言,我不确定如果您键入请求,为什么需要指定实体名。也许他们会在某个时候更新(我希望)

        9
  •  2
  •   William T.    7 年前

    如果使用的是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
    }()
    

    那么您应该使用这个fetch语法:

    let request: NSFetchRequest<Client> = Client.fetchRequest()
    

    当使用不同的变体时,在应用程序启动后的第一次提取时出现此错误:

    let request: NSFetchRequest<NSFetchRequestResult> = Client.fetchRequest()
    
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Client")
    
        10
  •  1
  •   Sam Grossberg    11 年前

    我建得很干净,但没修好。然后我删除了应用程序,但这并没有解决问题。然后我创建了clean并同时删除了这个应用程序,这就修复了它。

        11
  •  1
  •   Matthias    6 年前

    我在进入核心数据(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 . 不确定我在设置数据模型时是否做错了什么,或者。。。苹果的医生说 NSManagedObject.entity() 不能被覆盖?

    长话短说,代码文件 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")
    }
    
        12
  •  0
  •   CodeFlakes    13 年前

    加上同样的问题。我复制了我所有的实体。删除了数据模型,重新创建了一个空模型,并将实体粘贴回新的数据模型中。解决了我的问题。

        13
  •  0
  •   gone    11 年前

    首先,我通过组织者下载了应用程序的数据(查看发生了什么),并注意到它让我用以前的项目名称保存它。这使我困惑。所以我退出XCOD4.4.1,从iPhone上删除了应用程序(和它的数据),然后又回来了。

    这次我有个错误说 Cannot create an NSPersistentStoreCoordinator with a nil model . 所以我查看了AppDelegate.m文件并更改了 URLForResource - (NSPersistentStoreCoordinator *) persistentStoreCoodinator 方法。它被设置为我的应用程序的名称,我将其更改为“Model”,以便与Model.xcdatamodeld的名称匹配。
    现在开始工作了。

        14
  •  0
  •   user3457292user3457292    10 年前

    当我从错误的数据库中提取数据时,发生了这种情况。我的应用程序有3个sqlite数据库,当然还有3个ManagedObjectContext实例。我向错误的管理对象上下文提交了一个方法,要求它查询我提交的MaundObjeCurror上下文中不存在的表。在使用了正确的ManagedObjectContext之后,一切都很好。

        15
  •  0
  •   eselk    9 年前

    我认为最初的问题,以及大多数这些答案(只是以不同的方式)解决的问题,只是一个非常简单的问题:

    任何时候你修改你的核心数据(就像你提到的添加一个实体),你必须删除所有现有的数据(如果你还没有发布你的应用程序),或者给你的模型添加一个新版本。

    我想我会贴出这个答案,尽管这是一个老问题,因为这个答案似乎很明显,到目前为止还没有讨论过任何问题或评论我读到以上。

        16
  •  0
  •   John    8 年前

    也可以使用CoraData中的setter方法。。。就这样做。。。

    在您的CustomCoreDataManager.m上

    导入“ObjectiveRecord.h” 像这样调用init方法

    (实例类型)初始化{

    self=[超级初始化];

    如果(自己){

    [[CoreDataManager sharedManager]setModelName:@“YourModelName”]; }

    返回self;}

    希望这对某人有帮助。。。

        17
  •  0
  •   Kevin Delord    7 年前

    也许您试图从另一个/错误的包加载数据库? 例如从一个框架还是在一个框架内?

    我有这个问题,通过从 bundle 相关框架的。然后一切顺利!!

    Swift 4+魔法记录:

    let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
    let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
    MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
    NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
    MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite")
    

    瞧!

        18
  •  0
  •   Xcodian Solangi    6 年前

    我也面临同样的问题,实际上我打电话给 MyEnty 而不是 MyEntity 因此,请重新检查您为实体指定的名称,并调用相同的名称,还请检查您调用的属性是否与您定义的类似 name