【问题标题】:MagicalRecord createEntity error in SwiftSwift 中的 MagicalRecord createEntity 错误
【发布时间】:2014-09-09 14:01:14
【问题描述】:

我在我的 Swift 项目中使用 MagicalRecord - CoreData 库崩溃了:https://github.com/magicalpanda/MagicalRecord

首先,我在 AppDelegate.swift 中设置 MagicalRecord OK:

MagicalRecord.setupCoreDataStack() //-> This is OK. Don't crash

但是,当我想创建一个“联系人”实体实例时,我遇到了崩溃。

我的代码是下一个:

var context = NSManagedObjectContext.MR_contextForCurrentThread() // -> This is OK. Don't crash
var contact = Contact.MR_createInContext(context) // -> CRASH

所有编译都可以,但是当应用程序运行时,我会遇到下一次崩溃:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an entity named 'MyProject.Contact' in this model.' *** First throw call stack: 
(0x27861f77 0x34870c77 0x27590c73 0x9b93d 0x74f28 0x75438 0x2aea6e33 0x2b09acef 0x2b09d19d 0x2b0a79f9 0x2b09ba5b 0x2e106141 0x2782881d 0x27827ae1 0x2782627f 0x27773da1 0x27773bb3 0x2aea0ae7 0x2ae9bc41 0x75ab0 0x75aec 0x34e10aaf) 
libc++abi.dylib: terminating with uncaught exception of type NSException

MyProject 的键是 $(PRODUCT_NAME),我该如何解决这个问题?

亲切的问候

【问题讨论】:

  • 请不要使用 MR_contextForCurrentThread。你会崩溃,它会是随机的和神秘的。不要使用它。

标签: ios core-data swift magicalrecord


【解决方案1】:

这个问题有一个简单的解决方案。只需在 swift NSManagedObject 子类之前添加 @objc(ClassName) 即可。这允许 Objc 方知道类的正确名称。否则它将包含在这种情况下不好的模块名称,因为它与您的核心数据模型中的内容不匹配。这是我的一个快速项目中的示例......

@objc(Plant) 公共类 Plant: NSManagedObject

【讨论】:

    【解决方案2】:

    MagicalRecord 似乎会自动计算实体名称,但这样做的方式是错误的。您可以通过将以下代码添加到您的 Contact 类来解决此问题:

    class func entityName() -> String {
        return "Contact"
    }
    

    【讨论】:

    • 我发现这样做解决了我的问题,但是我需要使用方法MR_entityName() 的非速记版本。这与在实体建模器中添加类前缀相结合。
    【解决方案3】:

    在 Swift 中,您可能需要将实体的类设置为 MyProject.Contact,以便通过模型自动找到它。在实体建模器右侧的实体检查器中,您可以在那里更改类名。

    【讨论】:

      【解决方案4】:

      Guido Hendriks 的解决方案,带有支持所有托管对象的扩展:

      extension NSManagedObject {
          class func entityName() -> String {
              return NSStringFromClass(self).componentsSeparatedByString(".").last!
          }
      }
      

      【讨论】:

        【解决方案5】:

        感谢您的回答。我认为 Guido Hendriks 是一个很好的答案。我尝试了 casademora 答案,但我没有得到应用程序的工作。 最后,我将 CoreData 类语言(Contact Class)从 Swift 更改为 Objective-C,现在 MagicalRecord 库工作正常!

        谢谢!

        【讨论】:

          【解决方案6】:

          我不得不处理同样的问题,我花了一段时间才弄清楚如何... 感谢@casademora,我将这些类创建为 Obj-C 类,并将标题导入到我的 swift 项目的 bridging-header 中。

          1. 选择您的 .xcdatamodeld 文件
          2. 编辑器
          3. 创建 NSManagedObject 子类
          4. 选择您的数据模型和实体
          5. 将文件另存为 Objective-C 类

          给你一张漂亮的照片:

          并且在前缀头文件中:

          #ifndef DBSwiftTest_Bridging_Header_h
          #define DBSwiftTest_Bridging_Header_h
          
          #import <Foundation/Foundation.h>
          #import <UIKit/UIKit.h> 
          
          #import "DKDBManager.h" // My database manager
          #import "Runner.h"      // My model in this example
          
          #endif
          

          【讨论】:

            【解决方案7】:

            您可以在objective-c 中创建实体类,并通过桥接头将它们公开给swift。这样崩溃就消失了

            【讨论】:

              【解决方案8】:

              我也有同样的问题。这是我为解决它所做的:

              第 1 步:正如 Guido Hendriks 在他的回答中提到的那样

              MagicalRecord 似乎会自动计算实体名称,但这样做的方式是错误的。您可以通过将以下代码添加到您的联系人类来解决此问题"

              class func entityName() -> String {
                  return "Contact"
              }
              

              第 2 步:在您的 DataModel 中,将实体的类从 Contact 更改为 ProjectName.Contact

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-08-16
                • 1970-01-01
                • 1970-01-01
                • 2012-10-06
                • 2014-11-02
                相关资源
                最近更新 更多