我有一个使用CoreData的iPhone应用程序。
我想在其中添加预先填充的SQLite数据库。该数据库有1个表(地理位置,大约50K).cities.sql 我有点疑惑什么是添加这个数据库的最佳方法?
我看到了几种方法(例如在/ Users / user / Library /中找到app文件夹)但我的外部数据库实际上与apps数据库没有相同的结构(没有“User”表等...) 。
我只想将这个cities.sqlite视为一些数据源..如果有必要,我不介意将它与app appname.sqlite合并......
我也在使用RestKit来管理CoreData / API集成。
问题 - 如何将这个cities.sqlite添加到应用程序中,以便我可以使用该数据库中预先填充的数据发送应用程序?
答案 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:
来指定持久性存储。否则,它会对保存新城市的位置感到困惑。
或者只是将这两个商店合并为一个文件。