【问题标题】:Core Data model files does not load on rename重命名时不加载核心数据模型文件
【发布时间】:2011-10-26 01:21:27
【问题描述】:

我有一个名为“Model”的模型文件。如果我将它重命名为“SomeOtherName”,它就不会被加载。

initWithContentsOfURL 返回 nil 并且:

mergedModelFromBundles: [NSArray arrayWithObjects:[NSBundle mainBundle], nil]; 

...因为它认为这个数组中有 nil 而崩溃。

我可以重命名我的模型,有什么问题吗?我无法为您提供更多信息,因为我没有:P SomeOtherName 模型放置在捆绑包中,它应该可以正常加载。

谢谢

【问题讨论】:

    标签: cocoa core-data


    【解决方案1】:

    这对我有用:

    1. 点击您的 YourName.xcdatamodel
    2. 右键单击它以显示文件检查器
    3. 右侧可以看到“Target Membership”,应该有一个复选标记。

    (检查 AppDelegate 中的名称是否与您的 xcdatamodel 文件相同。 -> 让容器 = NSPersistentContainer(name: "YourName") ......)

    【讨论】:

      【解决方案2】:

      我最近在向我的数据模型实体添加新属性时遇到了这个问题。

      我必须做到以下几点:

      1. 将我的 Entity+CoreDataClass.hEntity+CoreDataClass.m 文件的内容复制到文本编辑器,以保存我为这些类创建的自定义属性(例如计算属性)
      2. 删除 XCode 为我生成的 4 个文件:Entity+CoreDataClass.hEntity+CoreDataClass.mStockEntity+CoreDataProperties.h、&StockEntity+CoreDataProperties.m
      3. 将新属性添加到.xcdatamodelId 文件中的实体
      4. 从列表中选择实体并选择Editor -> Create NSManagedObject Subclass...
      5. 将我在步骤 1 中复制的计算属性添加回 Entity+CoreDataClass.hEntity+CoreDataClass.m 文件中
      6. 为我的目标选择构建阶段并从Compile Sources 列表中删除Entity+CoreDataClass.m 文件
      7. .xcdatamoelId 文件添加到Compile Sources 列表中。

      然后我就能够成功构建并运行该项目。

      【讨论】:

        【解决方案3】:

        使用 Xcode 7.2.1:

        1. 转到项目导航器
        2. 选择数据模型文件(例如 MyProject.xcdatamodeld)
        3. 选择该文件的文件检查器
        4. 更改模型版本

        【讨论】:

        • 这是唯一适用于我的 Xcode 8 和 Swift 3 的解决方案。我将工具版本更改为 Xcode 7.3 而不是 8,它开始工作了。
        【解决方案4】:

        我刚刚遇到了同样的问题。以下是我的解决方法:

        仅重命名模型文件是不够的,因为它不会重命名对当前模型版本的引用

        原来模型版本存储在一个单独的 plist 文件中。只需在文本编辑器中打开它,然后将旧名称更改为新模型文件名。

        文件:YourNEWModelFile.xcdatamodeld/.xccurrentversion

        <plist version="1.0">
          <dict>
             <key>_XCCurrentVersionName</key>
             <string>YourModelFile.xcdatamodel</string>  <-- Change this to YourNEWModelFile
          </dict>
        </plist>
        

        请注意,只有在开发期间重命名模型文件时才应该这样做。要将您的数据模型迁移到新版本,请遵循 Core Data 文档。

        【讨论】:

        • 我看不到这个 plist。它在捆绑包中吗?
        • 抱歉,找到了。我想另一种解决方案是从 sim 中删除应用程序?
        • 这对我有用! thx: 在终端中打开 open -a textedit "filelocation"
        【解决方案5】:

        最可能的原因是新名称未包含在构建目标中。检查包含文件的目标并确保新名称存在。如果没有,请添加它。如果旧文件名在那里,请在添加新文件之前将其删除。

        如果它在构建目标中,请确认新文件保留.xcdatamodel 扩展名。检查构建的产品包以确认它包含具有新名称的.mom.momd 文件。

        您的 mergeModelFromBundles: 应该如下所示:

        NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]];
        

        ... 或:

        NSManagedObjectModel *mom=[NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObjects:[NSBundle mainBundle],nil] ]; 
        

        【讨论】:

        • 合并看起来像这样。它的异常是:'NSInvalidArgumentException',原因:'*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil' *** First throw call stack:
        • 如果您使用第一个表单并收到错误,那么问题是由于某种原因没有返回mainbundle。您应该记录来自 [NSBundle mainBundle] 的返回以确认。你是在 MacOS 还是 iOS 上工作?
        【解决方案6】:

        您的 Core Data 初始化代码是什么样的?它应该是这样的:

        NSManagedObjectModel *managedObjectModel = nil;
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SomeOtherName" withExtension:@"mom"];
        
        NSAssert(modelURL != nil);
        managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
        

        【讨论】:

        • 看起来像这样。然后我将modelURL登录到控制台并将其放入终端并执行ls。它给了我 SomeOtherName.mom 和 VersionInfo.plist ( SomeOtherName.momd 文件夹的内容)
        • 你确定你有那个断言,例如URL 不是零?在问题中显示您的 Core Data 上下文初始化代码可能会有所帮助。
        猜你喜欢
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多