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

时间:2010-09-02 22:24:36

标签: iphone objective-c core-data nsmanagedobject

我的程序需要采用预先填充的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

3 个答案:

答案 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之前修复此问题,如其他人所建议的那样。