2

在我的项目中,我使用 CoreData 创建和使用数据库,它工作得非常好。现在我有一个 SQLite 数据库文件(.db),我想将它集成到我的项目中并使用它(使用 coredata)。

我已将 .db 文件添加到我的项目中,并使用以下代码在 Documents 目录中创建了它的可写副本 -

- (void)createEditableCopyOfDatabaseIfNeeded {
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"wordlist1000.db"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success)
    return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"wordlist1000.db"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
    NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}

}

现在,当我尝试从数据库中获取结果时,出现此错误

SQLite 错误代码:1,'没有这样的表:Z_METADATA',NSSQLiteErrorDomain=1}

请告诉我如何从这里开始。一些代码示例会很有帮助。

总而言之,我只想导入一个外部数据库并使用 CoreData 在我的 xCode 项目中使用它。

谢谢!

4

2 回答 2

2

你不能那样做。Core Data 不是 SQLite 的简单包装器。它提供了一个非常不同的 API,并使用自己的、未记录的 SQLite 模式。SQLite 是一个实现细节,而不是你可以通过 Core Data 直接使用的东西。

如果您想将 SQLite 数据导入 Core Data,您需要:

  1. 将 Core Data 模型文件添加到您的项目并将其配置为包含适当的实体以匹配您的架构。
  2. 使用 SQLite 自己的原生 API 或诸如 FMDB 或 PLDatabase 之类的 Objective-C 包装器之一从 SQLite 读取数据。
  3. 使用 Core Data 的 API 将该数据写入新的 Core Data 存储文件。

您可能只想将数据留在 SQLite 中。FMDB 和 PLDatabase 提供了非常方便的包装器,让您可以继续在代码中使用 SQL 主义,而不是切换到 Core Data 方法。

于 2013-04-10T17:33:37.317 回答
1

核心数据在 sqlite 中存储数据的方式与您存储的方式不同。核心数据会创建额外的表格来保存有关您的实体的信息。所以你的sqlite db必须相同,这样操作就不会出现任何问题。

跟着Ray Wenderlich's great Core Data Tutorial: How To Preload/Import Existing Data

于 2013-04-10T13:38:55.223 回答