如何将SQLite数据库添加到iOS(核心数据)应用程序?

时间:2013-02-21 20:49:06

标签: ios sqlite core-data

我有一个使用CoreData的iPhone应用程序。

我想在其中添加预先填充的SQLite数据库。该数据库有1个表(地理位置,大约50K).cities.sql 我有点疑惑什么是添加这个数据库的最佳方法?

我看到了几种方法(例如在/ Users / user / Library /中找到app文件夹)但我的外部数据库实际上与apps数据库没有相同的结构(没有“User”表等...) 。

我只想将这个cities.sqlite视为一些数据源..如果有必要,我不介意将它与app appname.sqlite合并......

我也在使用RestKit来管理CoreData / API集成。

问题 - 如何将这个cities.sqlite添加到应用程序中,以便我可以使用该数据库中预先填充的数据发送应用程序?

2 个答案:

答案 0 :(得分:3)

确定,

我创建预填充数据库的方法是创建一个虚拟应用程序,其目标是仅填充要创建的数据库。这让我可以在不使用真实应用程序的情况下对数据库进行一些测试。显然,模型应该是相同的。

然后,您可以将它放到真实应用的主要包中。一旦执行,应用程序将检查文档文件夹中是否存在数据库(例如),如果不存在,它将将数据库中的数据库复制到文档文件夹。

NSString *storePath = [[self applicationDocumentsDirectory] 
    stringByAppendingPathComponent: @"yourStore.sqlite"];
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] 
        pathForResource:@"yourStore" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

Core Data Import中,您可以找到我的意思(对于第二部分,但您也可以自由地遵循填充数据库的方法)。

希望有所帮助。

修改

我会尝试更好地解释。

您创建了一个虚拟项目。

您可以在此处使用在主应用中创建的模型(及其实体)。把它复制到我的虚拟项目中。 创建一些代码以通过NSManagedObjectContext填充sql存储。 结果将包含已填充的sql存储区。您不需要触摸任何sql存储(仅通过Core Data)。 将应用程序文件夹目录移动到App Simulator中,复制商店并将其放入主应用程序包中。

答案 1 :(得分:2)

编辑:如果您使用普通的SQLite数据库,则需要将数据迁移到CoreData友好的持久存储。为此,您可以使用sqlite库来读取数据。您可以直接在应用程序中执行此操作,或者为此编写一些ulitity应用程序。获得SQLite核心数据持久性存储后,请按照我原来的帖子进行操作:


使用Core Data,您可以将多个SQLite存储组合到一个上下文中。只需在NSPersistentStoreCoordinator添加两个持久性商店。

[coordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:mainSQLiteURL // URL for your main DB
                                options:nil
                                  error:nil];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:citiesSQLiteURL // URL for the additional DB
                                options:nil
                                  error:nil];

在此之后,当您使用实体NSFetchRequest创建City时(我不知道您的实体名称),它将从两个SQLite文件中返回城市。

如果您只想搜索其中一个商店,可以设置获取请求的-setAffectedStores:。此外,当您插入新的City对象时,您需要通过在上下文中调用-assignObject:toPersistentStore:来指定持久性存储。否则,它会对保存新城市的位置感到困惑。

或者只是将这两个商店合并为一个文件。