【问题标题】:Creating entity with Magical Record only in OSX (+entityForName: could not locate an entity named '(null)' in this model.)仅在 OSX 中使用 Magical Record 创建实体(+entityForName:在此模型中找不到名为“(null)”的实体。)
【发布时间】:2013-10-06 16:29:03
【问题描述】:

您好,我在 OSX 中使用 magicRecord 创建实体时遇到问题,我创建了模型和 NSManagedSubclasses 等等。但是当我在 applicationDidFinishLaunching 中运行这段代码时(我使用的是 magicRecord 2.2):

[MagicalRecord setupCoreDataStack];
Person * person = [Person MR_createEntity];
person.name = @"alex";

我在日志中得到了这个:

2013-10-06 18:01:54.320 TestMagicalRecord[7554:303] +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0x7fff71a96238) -> Created Context UNNAMED
2013-10-06 18:01:54.321 TestMagicalRecord[7554:303] +[NSManagedObjectContext(MagicalRecord) MR_setRootSavingContext:](0x7fff71a96238) Set Root Saving Context: <NSManagedObjectContext: 0x101924d00>
2013-10-06 18:01:54.321 TestMagicalRecord[7554:303] +[NSManagedObjectContext(MagicalRecord) MR_newMainQueueContext](0x7fff71a96238) Created Main Queue Context: <NSManagedObjectContext: 0x1001564a0>
2013-10-06 18:01:54.321 TestMagicalRecord[7554:303] +[NSManagedObjectContext(MagicalRecord) MR_setDefaultContext:](0x7fff71a96238) Set Default Context: <NSManagedObjectContext: 0x1001564a0>
2013-10-06 18:01:54.322 TestMagicalRecord[7554:303] +entityForName: could not locate an entity named '(null)' in this model.

当我在 IOS 项目中运行相同的代码时,它运行没有问题,我一直在尝试找到 OSX 的示例代码,但没有运气,它应该有什么不同吗?

Magical record Github repo 中的 Mac 示例代码只包含一个项目,有没有办法与其他资源一起运行它?

我打赌这是一个简单的解决方案,但我在 Docs/SO 中找不到任何可行的方法。

【问题讨论】:

    标签: macos core-data magicalrecord


    【解决方案1】:

    正如您同时发现的,这是 Magical Record 开发分支中的一个错误。

    在2.2版本的Development分支中,MR_createEntity使用如下方法来确定应该创建的对象的实体名称:

    + (NSString *) MR_bestGuessAtAnEntityName
    {
        if ([self respondsToSelector:@selector(entityName)])
        {
            return [self performSelector:@selector(entityName)];
        }
        return NSStringFromClass(self);
    }
    

    但是(至少在 OS X 10.8 上),NSObject 实际上响应entityName,并调用 该方法返回nil。我找不到任何关于此的文档,所以这可能是 一些内部未记录的方法。

    但效果是MR_bestGuessAtAnEntityName返回nil,因此

    + (id) MR_createInContext:(NSManagedObjectContext *)context
    {
        return [NSEntityDescription insertNewObjectForEntityForName:[self MR_bestGuessAtAnEntityName] inManagedObjectContext:context];
    }
    

    失败并显示错误消息

    +entityForName: 在此模型中找不到名为“(null)”的实体。

    所以这是一个神奇的记录错误,值得向维护者报告。 该错误仅出现在 OS X 上,因为 NSObject(或 NSManagedObject)在 iOS 上不会响应 entityName

    【讨论】:

      【解决方案2】:

      确保您的模型文件正在编译为目标的一部分。您可以通过在项目导航器中选择 xcdatamodel 文件来查看这一点,然后在检查器区域中查找它所属的目标。或者,您可以检查您的构建设置并确保此文件位于编译文件部分。

      【讨论】:

      • 感谢您的快速响应,xcdatamodel 文件已添加到目标中。并且 DefaultContext 不是 nil(如果有帮助的话)。
      【解决方案3】:

      问题是我没有使用 Github 的正确分支,我使用的是 Development 分支而不是 Master 分支!希望这可以帮助其他犯这种愚蠢错误的人......

      【讨论】:

        【解决方案4】:

        喜欢马丁 R!

        • 转到文件NSManagedObject+MagicalRecord.m
        • 查找方法:+ (NSString *) MR_bestGuessAtAnEntityName
        • 替换为:return NSStringFromClass(self);

        工作正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多