Подтвердить что ты не робот

ExecuteFetchRequest: ошибка: запрос на выборку должен иметь объект

У меня был проект, который работал нормально. Он проверил "Основные данные" и установил модель данных. Я только начал добавлять пару сущностей и свойств сегодня вечером. Когда я попытаюсь запустить приложение сейчас, он даже не загрузится. Он просто падает на меня.

Здесь ошибка:

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

Я действительно боюсь, потому что у меня нет резервной копии этого, и если я не могу заставить его работать, я не знаю, что я буду делать.:)

Спасибо заранее!

РЕДАКТИРОВАТЬ: Мне надоело мои данные, поэтому я просто скопировал новый пустой xcdatamodel в свой проект, и я собираюсь начать новый. Спасибо за помощь!

4b9b3361

Ответ 1

Казалось, что мои данные повреждены, поэтому я удалил свою модель данных и базу данных в симуляторе iPhone и начал новый.

Ответ 2

Моя проблема: я не использовал одно и то же имя для Entity и Class. Тривиальное решение для его исправления - это дать им одно и то же имя.

Ответ 3

Если вы используете MagicalRecored с Swift:

Убедитесь, что вы используете директиву @objc в подклассе Swift NSManagedObject, чтобы сделать класс доступным для Objective-C кода из библиотеки MagicalRecord

@objc(MyEntity)
class MyEntity: NSManagedObject {
    @NSManaged var myAttribute: Int16
}

Ответ 4

После поиска решения для всего, что исправлено для меня, я делал команду Clean/Build в Xcode.

Product- > Clean, Product- > Build, затем попробуйте запустить его.

Ответ 5

У меня была такая же ошибка.

Для меня это потому, что я добавил новую версию модели, но я не задал ее как "Текущая версия". Небрежно! Чтобы исправить, выберите xcdatamodel, щелкните "Дизайн" > "Модель данных" > "Установить текущую версию". Затем файл xcdatamodel будет иметь зеленый галочку.

Надеюсь, что это поможет.

Ответ 6

Кроме того, убедитесь, что ваш файл .xcdatamodeld находится в фазе "Копирование запаса" фаз сборки.

Ответ 7

Проверьте, если,

  • объект присутствует в файле xcdatamodel.
  • Используемое имя сущности одинаково.

Ответ 8

Вот что исправил это для меня:

Когда я конвертировал в Swift 3, Xcode выдавал мне ошибку при объявлении нового NSFetchRequest, говоря, что ему нужен тип. После добавления типа я сделал то, что кто-либо еще допустил бы; если запрос задан, зачем указывать имя объекта? Итак, я удалил его.

На самом деле это была моя ошибка.

Swift 2.2:

let request = NSFetchRequest(entityName: "MyEntity")

Когда я впервые преобразован в Swift 3:

let request = NSFetchRequest<MyEntity>()

Это дало мне ошибку. Я закончил с этим:

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

И все работает отлично. Лично я не уверен, почему он должен указывать имя объекта, если вы вводите запрос. Возможно, они обновят это в какой-то момент (надеюсь)

Ответ 9

Если вы используете синтаксис нового стека 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")

Ответ 10

Я построил чистую, и это не исправить. Затем я удалил приложение, и это не исправить. Затем я построил чистую и удалил приложение в одно и то же время, и это исправило его.

Ответ 11

Просто добавьте ту же проблему. Я скопировал все мои сущности. Удалил модель данных, воссоздал пустой и вставил объекты обратно в новую модель данных. Решил мою проблему.

Ответ 12

Сначала я загрузил данные приложения через Организатор (чтобы посмотреть, что происходит), и заметил, что он предложил мне сохранить его под предыдущим именем проекта. Это меня озадачило. Поэтому я вышел из XCode 4.6.1, удалил приложение (и его данные) с моего iPhone и вернулся.

На этот раз я получил сообщение об ошибке Cannot create an NSPersistentStoreCoordinator with a nil model. Поэтому я заглянул в файл AppDelegate.m и изменил URLForResource в методе - (NSPersistentStoreCoordinator *) persistentStoreCoodinator. Он был настроен на имя моего приложения, и я изменил его на "Модель", чтобы соответствовать имени моего Model.xcdatamodeld.
Он работает сейчас.

Ответ 13

Это случилось со мной, когда я извлекал из неправильной базы данных. Мое приложение имеет 3 базы данных sqlite и, конечно, 3 экземпляра ManagedObjectContext. Ну, я отправил неправильный ManagedObjectContext в метод, попросив его запросить таблицу, которой не было в представленном ManagedObjectContext. После использования правильного ManagedObjectContext все было хорошо.

Ответ 14

Я думаю, что исходный вопрос/проблема, а также проблема, которую исправляет большинство этих ответов (по-разному), является просто простой:

В любое время, когда вы изменяете основные данные (например, добавляете сущность по мере упоминания), вам либо нужно удалить все существующие данные (если вы еще не опубликовали приложение), либо добавить новую версию в свою модель.

Просто подумал, что я опубликую этот ответ, хотя это старый вопрос, потому что этот ответ кажется довольно очевидным и до сих пор не обсуждался ни в одном из вопросов или комментариев, которые я читал выше.

Ответ 15

Вы также можете использовать метод setter из CoraData... Просто сделайте что-нибудь подобное...

На вашем CustomCoreDataManager.m

import "ObjectiveRecord.h" метод вызова init, подобный этому

(instancetype) init {

self = [super init];

if (self) {

[[CoreDataManager sharedManager] setModelName: @ "YourModelName" ]; }

return self; }

Надеюсь, это поможет кому-то...

Ответ 16

Возможно, вы пытаетесь загрузить базу данных из другого/неправильного пакета? Например, из или в рамках Framework?

У меня была эта проблема и она была решена, загрузив БД из bundle соответствующей Framework. И тогда все прошло отлично!

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")

И вуаля!

Ответ 17

Я наткнулся на ту же самую точную ошибку, сделав свои первые шаги в 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")
}

Ответ 18

Я столкнулся с той же проблемой, на самом деле я звонил MyEnty вместо MyEntity, поэтому, пожалуйста, перепроверьте, какие имена вы дали своим сущностям, и назовите их так же, а также проверьте, вызываете ли вы те же атрибуты, которые вы определили, как name