我的程序需要采用预先填充的sql数据库,然后将记录保存到应用程序的数据库中。遗憾的是,由于某种原因,应用程序在应用程序委托中退出此方法:
#pragma mark -
#pragma mark Core Data stack
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"iProspectLite" ofType:@"sqlite"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
}
似乎应用程序找不到有效的managedObjectModel_,或者它不存在,或者没有创建一个。我该如何解决这个问题?
我在控制台上收到的错误消息之一是: 由于未捕获的异常原因终止应用程序:[NSKeyedUnarchiver initForReadingWithData:]
部分内容我已缩小到NSManagedObject,因为似乎没有创建或找到。
其他可能有用的信息: 我添加了一个实体和定义的属性,如许多其他核心数据教程中所述 以下是定义我的实体的类:
#import "Mine.h"
@implementation Mine
@dynamic primarykey;
@dynamic name;
@dynamic firstCommodity;
@dynamic longitude;
@dynamic county;
@dynamic secondCommodity;
@dynamic latitude;
@dynamic thirdCommodity;
@end
答案 0 :(得分:2)
您在哪里获得预先填充的SQLite数据库?如果它不是使用Core Data创建的,那么它将不起作用。核心数据只能读取使用Core Data创建的SQLite文件。
答案 1 :(得分:1)
来自Apple的Core Data Development Guide:
编译数据模型
数据模型是 部署资源。此外 实体和属性的详细信息 在模型中,您创建的模型 Xcode包含有关的信息 图 - 它的布局,颜色 元素,等等。后者 运行时不需要信息。 编译模型文件以删除 无关的信息和制作 运行时加载资源为 尽可能高效。
xcdatamodel
“源”文件被编译成一个妈妈 使用该模型的部署文件 编译器,momc
。
换句话说,管理对象模型在构建过程中由Xcode从Xcode Data Model“source”“编译”,并且.mom
文件放在应用程序包中。因此,您可能需要手动创建数据模型文件。
要解决此问题,我使用Core Data-savvy命令行工具预先填充我用于iPhone项目的SQLite数据库文件。
修改强>
如果Zarra先生是正确的(他通常是),那么你应该按照我描述的方式编写命令行工具,打开现有数据库,然后使用Core Data预先填充新的SQLite数据库文件。这有点痛苦,但它会起作用。
答案 2 :(得分:1)
您的问题是您尝试将模型文件从路径加载到应用程序包内的SQL持久性存储。商店和模型文件是两种不同类型的文件,具有两个独立的功能。您无法从SQL文件初始化NSManagedObjectModel实例,反之亦然,因为这两种文件类型包含完全不同的信息。
您需要更改pathForResource:
以查找正确的文件。文件类型为mom
,默认名称为应用名称,因此您应使用以下内容:
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"AppName" ofType:@"mom"];
(如果您将其命名为其他名称,请使用该名称。)
所有这些都与导入现有SQL文件无关。但是,您需要在导入SQL之前修复此问题,如其他人所建议的那样。