Swift中的MagicalRecord createEntity错误

时间:2014-09-09 14:01:15

标签: ios core-data swift magicalrecord

我的Swift项目与MagicalRecord崩溃 - CoreData库:https://github.com/magicalpanda/MagicalRecord

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

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

但是,当我想创建一个" Contact"实体实例我遇到了崩溃。

我的代码是下一个:

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),我该怎么解决这个问题?

亲切的问候

8 个答案:

答案 0 :(得分:8)

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

@objc(工厂)公共类工厂:NSManagedObject

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

谢谢!

答案 5 :(得分:0)

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

  1. 选择.xcdatamodeld文件
  2. 编辑
  3. 创建NSManagedObject子类
  4. 选择您的数据模型和实体
  5. 将文件另存为Objective-C类
  6. 在这里你可以看到一张漂亮的照片:

    enter image description here

    在前缀头文件中:

    #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
    

答案 6 :(得分:0)

您可以在objective-c中创建实体类,并通过桥接头向swift公开它们。那种崩溃消失了

答案 7 :(得分:0)

我有同样的问题。以下是我要解决的问题:

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

  

似乎MagicalRecord会自动计算实体名称,并以错误的方式执行此操作。您可以通过将以下代码添加到Contact类&#34;

来解决此问题
class func entityName() -> String {
    return "Contact"
}

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

enter image description here