Iphone 无法将预填充的sql数据库保存到核心数据sql数据库:找不到managedObjectModel

Iphone 无法将预填充的sql数据库保存到核心数据sql数据库:找不到managedObjectModel,iphone,objective-c,core-data,nsmanagedobject,Iphone,Objective C,Core Data,Nsmanagedobject,我的程序需要获取一个预填充的sql数据库,然后将记录保存到应用程序的数据库中。不幸的是,由于某些原因,应用程序在应用程序委托的此方法中退出: #pragma mark - #pragma mark Core Data stack - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel_ != nil) { return managedObjectModel_; } NSString *mo

我的程序需要获取一个预填充的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,或者它不存在,或者没有创建有效的managedObjectModel。我如何解决这个问题

我在控制台上收到的错误消息之一是: 由于未捕获的异常原因终止应用程序:[NSKeyedUnachiver initForReadingWithData:]

其中一部分我已经缩小到NSManagedObject,因为似乎没有创建或找到一个

其他可能有用的信息: 我添加了一个实体并定义了许多其他核心数据教程中描述的属性 以下是定义我的实体的类:

#import "Mine.h"


@implementation Mine 

@dynamic primarykey;
@dynamic name;
@dynamic firstCommodity;
@dynamic longitude;
@dynamic county;
@dynamic secondCommodity;
@dynamic latitude;
@dynamic thirdCommodity;

@end
来自苹果的:

编译数据模型

数据模型是 部署资源。除了 实体和属性的详细信息 在模型中,是在中创建的模型 Xcode包含有关 绘制它的布局、颜色和颜色 元素,等等。后者 运行时不需要信息。 模型文件被编译以删除 无关信息与决策 资源的运行时加载为 尽可能高效。
xcdatamodel
“源”文件被编译成mom 使用该模型的部署文件 编译器,
momc

换句话说,托管对象模型在构建过程中由Xcode从Xcode数据模型“source”中“编译”,并且
.mom
文件放在应用程序包中。因此,您可能需要手动创建数据模型文件

为了解决这个问题,我使用了一个核心的命令行工具来预填充我在iPhone项目中使用的SQLite数据库文件

编辑:

如果Zarra先生是正确的(他通常是正确的),那么您应该按照我描述的方式编写一个命令行工具,打开现有数据库,然后用核心数据预填充一个新的SQLite数据库文件。这有点痛苦,但它会起作用。

来自苹果:

编译数据模型

数据模型是 部署资源。除了 实体和属性的详细信息 在模型中,是在中创建的模型 Xcode包含有关 绘制它的布局、颜色和颜色 元素,等等。后者 运行时不需要信息。 模型文件被编译以删除 无关信息与决策 资源的运行时加载为 尽可能高效。
xcdatamodel
“源”文件被编译成mom 使用该模型的部署文件 编译器,
momc

换句话说,托管对象模型在构建过程中由Xcode从Xcode数据模型“source”中“编译”,并且
.mom
文件放在应用程序包中。因此,您可能需要手动创建数据模型文件

为了解决这个问题,我使用了一个核心的命令行工具来预填充我在iPhone项目中使用的SQLite数据库文件

编辑:


如果Zarra先生是正确的(他通常是正确的),那么您应该按照我描述的方式编写一个命令行工具,打开现有数据库,然后用核心数据预填充一个新的SQLite数据库文件。这有点痛苦,但它会起作用。

您从哪里获得预填充的SQLite数据库?如果它不是用核心数据创建的,那么它就不会工作。Core Data只能读取使用Core Data创建的SQLite文件。

从哪里获得预填充的SQLite数据库?如果它不是用核心数据创建的,那么它就不会工作。Core Data只能读取使用Core Data创建的SQLite文件。

您的问题是,您试图将模型文件从路径加载到应用程序包中的SQL持久存储。存储和模型文件是两种不同类型的文件,具有两种不同的功能。不能从SQL文件初始化NSManagedObjectModel实例,反之亦然,因为这两种文件类型包含完全不同的信息

您需要更改
路径forresource:
以查找正确的文件。文件类型为
mom
,默认名称为应用程序名称,因此您应该使用如下内容:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"AppName" ofType:@"mom"];
(如果您将模型命名为其他名称,请使用该名称。)


所有这些都与导入现有SQL文件无关。但是,您需要在按照其他人的建议导入SQL之前修复此问题

您的问题是,您试图将模型文件从路径加载到应用程序包中的SQL持久存储。存储和模型文件是两种不同类型的文件,具有两种不同的功能。不能从SQL文件初始化NSManagedObjectModel实例,反之亦然,因为这两种文件类型包含完全不同的信息

您需要更改
路径forresource:
以查找正确的文件。文件类型为
mom
,默认名称为应用程序名称,因此您应该使用如下内容:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"AppName" ofType:@"mom"];
(如果您将模型命名为其他名称,请使用该名称。)


所有这些都与导入现有SQL文件无关。但是,您需要在按照其他人的建议导入SQL之前修复此问题

我想我已经创建了一个数据模型。我向datamodel添加了一个实体和属性,以及一个特定于该实体的类,如核心数据教程中所述。请检查构建目录中的应用程序包。是否存在
.mom
文件?(右键单击目标,在Finder中显示,右键单击.app,显示软件包内容)如果没有,并且您确定您有一个
xcdatamodel
,然后确保
xcdatamodel
文件列在Target.Ri的“编译源代码”部分下