Ответ 1
Казалось, что мои данные повреждены, поэтому я удалил свою модель данных и базу данных в симуляторе iPhone и начал новый.
У меня был проект, который работал нормально. Он проверил "Основные данные" и установил модель данных. Я только начал добавлять пару сущностей и свойств сегодня вечером. Когда я попытаюсь запустить приложение сейчас, он даже не загрузится. Он просто падает на меня.
Здесь ошибка:
'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'
Я действительно боюсь, потому что у меня нет резервной копии этого, и если я не могу заставить его работать, я не знаю, что я буду делать.:)
Спасибо заранее!
РЕДАКТИРОВАТЬ: Мне надоело мои данные, поэтому я просто скопировал новый пустой xcdatamodel в свой проект, и я собираюсь начать новый. Спасибо за помощь!
Казалось, что мои данные повреждены, поэтому я удалил свою модель данных и базу данных в симуляторе iPhone и начал новый.
Моя проблема: я не использовал одно и то же имя для Entity и Class. Тривиальное решение для его исправления - это дать им одно и то же имя.
Если вы используете MagicalRecored
с Swift
:
Убедитесь, что вы используете директиву @objc
в подклассе Swift NSManagedObject
, чтобы сделать класс доступным для Objective-C кода из библиотеки MagicalRecord
@objc(MyEntity)
class MyEntity: NSManagedObject {
@NSManaged var myAttribute: Int16
}
После поиска решения для всего, что исправлено для меня, я делал команду Clean/Build в Xcode.
Product- > Clean, Product- > Build, затем попробуйте запустить его.
У меня была такая же ошибка.
Для меня это потому, что я добавил новую версию модели, но я не задал ее как "Текущая версия". Небрежно! Чтобы исправить, выберите xcdatamodel, щелкните "Дизайн" > "Модель данных" > "Установить текущую версию". Затем файл xcdatamodel будет иметь зеленый галочку.
Надеюсь, что это поможет.
Кроме того, убедитесь, что ваш файл .xcdatamodeld находится в фазе "Копирование запаса" фаз сборки.
Проверьте, если,
Вот что исправил это для меня:
Когда я конвертировал в Swift 3, Xcode выдавал мне ошибку при объявлении нового NSFetchRequest
, говоря, что ему нужен тип. После добавления типа я сделал то, что кто-либо еще допустил бы; если запрос задан, зачем указывать имя объекта? Итак, я удалил его.
На самом деле это была моя ошибка.
Swift 2.2:
let request = NSFetchRequest(entityName: "MyEntity")
Когда я впервые преобразован в Swift 3:
let request = NSFetchRequest<MyEntity>()
Это дало мне ошибку. Я закончил с этим:
let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")
И все работает отлично. Лично я не уверен, почему он должен указывать имя объекта, если вы вводите запрос. Возможно, они обновят это в какой-то момент (надеюсь)
Если вы используете синтаксис нового стека 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")
Я построил чистую, и это не исправить. Затем я удалил приложение, и это не исправить. Затем я построил чистую и удалил приложение в одно и то же время, и это исправило его.
Просто добавьте ту же проблему. Я скопировал все мои сущности. Удалил модель данных, воссоздал пустой и вставил объекты обратно в новую модель данных. Решил мою проблему.
Сначала я загрузил данные приложения через Организатор (чтобы посмотреть, что происходит), и заметил, что он предложил мне сохранить его под предыдущим именем проекта. Это меня озадачило. Поэтому я вышел из XCode 4.6.1, удалил приложение (и его данные) с моего iPhone и вернулся.
На этот раз я получил сообщение об ошибке Cannot create an NSPersistentStoreCoordinator with a nil model
. Поэтому я заглянул в файл AppDelegate.m и изменил URLForResource
в методе - (NSPersistentStoreCoordinator *) persistentStoreCoodinator
. Он был настроен на имя моего приложения, и я изменил его на "Модель", чтобы соответствовать имени моего Model.xcdatamodeld.
Он работает сейчас.
Это случилось со мной, когда я извлекал из неправильной базы данных. Мое приложение имеет 3 базы данных sqlite и, конечно, 3 экземпляра ManagedObjectContext. Ну, я отправил неправильный ManagedObjectContext в метод, попросив его запросить таблицу, которой не было в представленном ManagedObjectContext. После использования правильного ManagedObjectContext все было хорошо.
Я думаю, что исходный вопрос/проблема, а также проблема, которую исправляет большинство этих ответов (по-разному), является просто простой:
В любое время, когда вы изменяете основные данные (например, добавляете сущность по мере упоминания), вам либо нужно удалить все существующие данные (если вы еще не опубликовали приложение), либо добавить новую версию в свою модель.
Просто подумал, что я опубликую этот ответ, хотя это старый вопрос, потому что этот ответ кажется довольно очевидным и до сих пор не обсуждался ни в одном из вопросов или комментариев, которые я читал выше.
Вы также можете использовать метод setter из CoraData... Просто сделайте что-нибудь подобное...
На вашем CustomCoreDataManager.m
import "ObjectiveRecord.h" метод вызова init, подобный этому
(instancetype) init {
self = [super init];
if (self) {
[[CoreDataManager sharedManager] setModelName: @ "YourModelName" ]; }
return self; }
Надеюсь, это поможет кому-то...
Возможно, вы пытаетесь загрузить базу данных из другого/неправильного пакета? Например, из или в рамках 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")
И вуаля!
Я наткнулся на ту же самую точную ошибку, сделав свои первые шаги в 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")
}
Я столкнулся с той же проблемой, на самом деле я звонил MyEnty
вместо MyEntity
, поэтому, пожалуйста, перепроверьте, какие имена вы дали своим сущностям, и назовите их так же, а также проверьте, вызываете ли вы те же атрибуты, которые вы определили, как name