Swift: основные данные на устройстве IOS7 -> Имя объекта для второго объекта равно нулю

#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