0

我的程序需要使用一个预填充的 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
4

3 回答 3

2

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

于 2010-09-03T05:50:21.610 回答
1

来自 Apple 的核心数据开发指南

编译数据模型

数据模型是一种部署资源。除了模型中实体和属性的详细信息之外,您在 Xcode 中创建的模型还包含有关图表的信息——它的布局、元素的颜色等等。运行时不需要后面的信息。编译模型文件以删除无关信息并使资源的运行时加载尽可能高效。“xcdatamodel 源”文件使用模型编译器编译成 mom 部署文件,momc.

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

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

编辑:

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

于 2010-09-02T22:55:06.173 回答
1

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

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

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"AppName" ofType:@"mom"];

(如果您将模型命名为其他名称,请使用该名称。)

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

于 2010-09-04T20:28:15.657 回答