核心数据模型文件在重命名时不加载

时间:2011-08-12 18:26:39

标签: cocoa core-data

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

initWithContentsOfURL返回nil并且:

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

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

我被允许重命名我的模型,所以有什么不对吗?我无法提供更多信息,因为我没有:P SomeOtherName模型放在包中,它应该加载得很好。

由于

6 个答案:

答案 0 :(得分:26)

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

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

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

档案:YourNEWModelFile.xcdatamodeld/.xccurrentversion

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

请注意,如果您在开发期间重命名模型文件,则仅应执行此操作。要将数据模型迁移到新版本,请遵循核心数据文档。

答案 1 :(得分:2)

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

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

您的mergedModelFromBundles:应该如下所示:

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

......或:

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

答案 2 :(得分:1)

使用Xcode 7.2.1:

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

答案 3 :(得分:1)

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

我必须做以下事情:

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

答案 4 :(得分:1)

这对我有用:

  1. 点击YourName.xcdatamodel
  2. 右键单击它以显示文件检查器
  3. 在右侧,您可以看到&#34;目标会员资格&#34;,应该有一个复选标记。
  4. (检查AppDelegate中的名称是否与您的xcdatamodel文件相同。   - &GT; let container = NSPersistentContainer(name:&#34; YourName&#34;)......)

答案 5 :(得分:0)

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

NSManagedObjectModel *managedObjectModel = nil;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SomeOtherName" withExtension:@"mom"];

NSAssert(modelURL != nil);
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];