如何使用Coredata添加和使用现有的SQLite数据库(x.db)?

时间:2013-04-10 13:29:39

标签: iphone ios sqlite core-data

在我的项目中,我使用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项目中使用它。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

  1. 将核心数据模型文件添加到项目中,并将其配置为包含与您的架构匹配的相应实体。
  2. 使用自己的本机API或其中一个Objective-C包装器(如FMDB或PLDatabase)从SQLite读取数据。
  3. 使用Core Data的API将该数据写入新的Core Data存储文件。
  4. 您可能只想将数据保留在SQLite中。 FMDB和PLDatabase提供了非常方便的包装器,使您可以继续在代码中使用SQL-isms而不是切换到Core Data方法。

答案 1 :(得分:1)

核心数据在sqlite中存储数据的方式与您存储的方式不同。核心数据创建其他表以保存有关您的实体的信息。因此,sqlite db必须相同,以便在操作中不会出现任何问题。

只需关注Ray Wenderlich's great Core Data Tutorial: How To Preload/Import Existing Data

即可