#ios #iphone #core-data #ios7 #swift
#iOS #iPhone #основные данные #ios7 #swift
Вопрос:
я тестировал swift в небольшом проекте iPhone, используя Xcode 6 beta 2. Проект использует основные данные для доступа к 2 объектам (пользователь / контракт) в модели данных. Внутри симулятора IOS все работает нормально.
Проблема: Когда я создаю приложение для IOS7 и тестирую приложение на своем iPhone5S (под управлением IOS 7.1.1), программа может сохранять данные только в первом объекте (как определено в core data model = User ). Для всех других объектов значение NSEntityDescription.entityForName(…) равно «nil». В managedObjectModel (println(managedObjectModel)) включены все объекты. Похоже, что модель данных неправильно включена в SQL-базу данных на IOS7 ?! У кого-нибудь есть решение / идея? Спасибо 🙂
var myAppDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var myContext:NSManagedObjectContext = myAppDel.managedObjectContext
println(NSEntityDescription.entityForName("User", inManagedObjectContext: myContext))
println(NSEntityDescription.entityForName("Contract", inManagedObjectContext: myContext))
var newContract:AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Contract", inManagedObjectContext: myContext)
newContract.setValue("" txtContract.text, forKey: "contractName")
myContext.save(nil)
var newUser = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: myContext)
newUser.setValue("" txtUsername.text, forKey: "userName")
newUser.setValue("" txtPassword.text, forKey: "userPass")
newUser.setValue(newContract, forKey: "contracts") // Save Relationship
myContext.save(nil)
Ошибка:
Завершение работы приложения из-за неперехваченного исключения ‘NSInternalInconsistencyException’, причина: ‘ entityForName: не удалось найти объект с именем ‘Contract’ в этой модели.’
Комментарии:
1. Я столкнулся с той же проблемой и, наконец, отказался от нее. Если я перестрою достаточное количество раз, это в конечном итоге сработает для одного или двух запусков, а затем снова прекратит запуск. Если у вас есть небольшой изолированный пример, я бы предложил отправить отчет об ошибке по адресу bugreport.apple.com . К сожалению, пример, над которым я работал, был довольно запутанным во многих отношениях, поэтому я отказался от него, так как просто еще один способ, которым swift все равно не будет готов к прайм-тайм для моего текущего проекта.
2. Привет, Дэйв, спасибо за ваш быстрый ответ! Я жду исправления ошибок. Возможно, я отправлю Apple сообщение об ошибке в начале недели.
3. Я думаю, что я тоже вижу эту проблему. На симуляторе iOS 8 все работает нормально, но, работая на моем iPhone iOS 7.1.2, я получаю следующую ошибку: «NSFetchRequest не удалось найти NSEntityDescription для имени объекта …». Я использую Xcode 6 Beta 4. Мои объекты context, model и storeCoorindator выглядят нормально — я вижу, что мой объект model содержит все правильные объекты. На данный момент я сдался; я попробую еще раз со следующей бета-версией.
Ответ №1:
Похоже, на данный момент это ошибка. Как объяснено в этом сообщении: https://devforums.apple.com/message/996259#996259 .
Обходной путь для этой ошибки заключается в использовании NSString вместо передачи строки в качестве имени объекта:
let myEntity: NSString = "EntityName"
var fetchRequest = NSFetchRequest(entityName: myEntity)
Комментарии:
1. Потрясающе, спасибо, что нашли это! Это устраняет проблему для меня.
2. Спасибо за решение. Просто обратите внимание, что это все еще происходит с Xcode 6 Beta 6, но только на некоторых устройствах. Мы протестировали приложение на четырех разных iPad, один с iOS 8 Beta 5 и три с iOS 7.1.2, и только один с iOS 7.1.2 отображал эту проблему.
3. Работает для меня, спасибо. Также вы можете встроить приведение к NSString следующим образом: NSFetchRequest(EntityName: «EntityName» как NSString)
4. Если вы не хотите жестко кодировать имя объекта, я нашел другой способ исправить это пусть имя: NSString = EntityName.mutableCopy() как NSString