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

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

问题描述:

我有一个使用CoreData的iPhone应用程序。如何将SQLite数据库添加到iOS(CoreData)应用程序?

我想添加一个预填充的SQLite数据库。该数据库有1个表(地理位置,其中约50K).. cities.sql 我有点疑惑什么是添加此数据库的最佳方式?我看到了几种方法(例如在/ Users/user/Library/...中定位app文件夹),但是我的外部数据库并没有真正与apps数据库具有相同的结构(没有“用户”表等。 )。

我只想把这个cities.sqlite一些数据源。我不介意合并,如果需要与应用appname.sqlite ...

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

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

+0

该应用是否已发布? – 2013-02-21 20:50:33

+0

不,不在开发中 – Stpn 2013-02-21 20:51:15

+0

您的SQLite数据库是否为Core Data格式?我的意思是,如果它是由Core Data创建的,那么它可以正确理解并打开它。 – Tricertops 2013-02-21 21:38:08

好吧,

我的方法来创建一个预填充db是创建具有目标只填入你想创建一个数据库中的虚拟应用程序。这让我无需使用真正的应用程序就可以对数据库进行一些测试。显然,模型应该是一样的。

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

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存储(仅通过核心数据)。 将应用程序文件夹目录移至App Simulator中,复制存储并将其放入主应用程序包中。

+0

创建的,你说模型应该是相同的 - 如果我的主数据库有“用户”,“场馆”,“城市”,例如,我只想导入“城市“ - 我可以使用这种方法导入具有1个表格(”城市“)但具有与主应用程序相同结构的cities.sqlite吗? – Stpn 2013-02-21 21:07:14

+0

对不起,我不明白你在问什么。你能更好地解释你的目标吗?谢谢 – 2013-02-21 21:08:39

+0

@Stpn你在谈论表或实体?您是使用普通的sqlite文件还是使用由Core Data创建的sqlite? – Tricertops 2013-02-21 21:45:38

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


核心数据,你可以有多个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:来指定持久存储。否则,它会对新城市的保存位置感到困惑。

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