1

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

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

我看到了几种方法(例如在 /Users/user/Library/... 中找到 app 文件夹),但我的外部数据库与应用程序数据库的结构并不相同(没有“用户”表等)。

我只是想把这个 citys.sqlite 当作一些数据源。如果有必要,我不介意将它与应用程序 appname.sqlite 合并...

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

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

4

2 回答 2

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 中,复制商店并将其放入主应用程序包中。

于 2013-02-21T21:01:35.937 回答
3

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


使用 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:上下文来指定持久存储。否则它将对保存新城市的位置感到困惑。

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

于 2013-02-21T21:55:18.120 回答