【问题标题】:Swift: Core Data on IOS7 device -> entityForName on second entity is nilSwift:IOS7 设备上的核心数据 -> 第二个实体上的 entityForName 为 nil
【发布时间】:2014-08-17 22:05:36
【问题描述】:


我已经使用 Xcode 6 beta 2 在一个小的 iPhone 项目上测试了 swift。 该项目使用核心数据访问数据模型中的 2 个实体(用户/合同)。在 IOS 模拟器内一切正常。

问题:当我为 IOS7 构建应用程序并在我的 iPhone5s(运行 IOS 7.1.1)上测试应用程序时,程序只能将数据保存到第一个实体(如核心数据模型 = 用户中所定义)。对于所有其他实体, NSEntityDescription.entityForName(...) 为“nil”。在 managedObjectModel (println(managedObjectModel)) 中包含所有实体。似乎数据模型不正确包含在 IOS7 上的 SQL 数据库中?!有人有解决方案/想法吗?谢谢:-)

    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”的实体。”

【问题讨论】:

  • 我遇到了同样的问题,最后放弃了。如果我重建足够多的时间,它最终会运行一两次,然后再次停止运行。如果您有一个小的孤立示例,我建议您在 bugreport.apple.com 上提交错误报告。不幸的是,我正在处理的示例在很多方面都非常令人费解,所以我放弃了它,因为另一种方式 swift 无论如何都不会为我当前的项目准备好黄金时间。
  • 嗨,戴夫,感谢您的快速回复!我正在等待错误更正。也许我会在本周早些时候向苹果发送错误报告。
  • 我想我也看到了这个问题。在 iOS 8 模拟器上一切正常,但在我的 iOS 7.1.2 iPhone 上运行时,我收到此错误:“NSFetchRequest 无法找到实体名称的 NSEntityDescription ...”。我正在使用 Xcode 6 Beta 4。我的上下文、模型和 storeCoorindator 对象看起来都很好——我可以看到我的模型对象包含所有正确的实体。我暂时放弃了;我会在下一个测试版中再试一次。

标签: ios iphone core-data ios7 swift


【解决方案1】:

这似乎是一个错误。如本文所述:https://devforums.apple.com/message/996259#996259

这个错误的解决方法是使用 NSString 而不是传递一个字符串作为实体名称:

    let myEntity: NSString = "EntityName"
    var fetchRequest = NSFetchRequest(entityName: myEntity)

【讨论】:

  • 太棒了,感谢您发现!这解决了我的问题。
  • 感谢您的解决方案。请注意,Xcode 6 Beta 6 仍然会发生这种情况,但仅限于某些设备。我们已经在四款不同的 iPad 上测试了一款应用,一款使用 iOS 8 Beta 5,三款使用 iOS 7.1.2,只有一款使用 iOS 7.1.2。
  • 对我有用,谢谢。您也可以像这样内联转换为 NSString: NSFetchRequest(entityName: "EntityName" as NSString)
  • 如果您不想硬编码实体名称,我找到了另一种解决此问题的方法 let name:NSString = entityName.mutableCopy() as NSString
猜你喜欢
  • 2017-09-08
  • 2012-07-20
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多