Database 在ios7中读取预填充的Sqlite.db

Database 在ios7中读取预填充的Sqlite.db,database,sqlite,core-data,ios7,Database,Sqlite,Core Data,Ios7,我对ios世界真的很陌生,我有一个应用程序被苹果拒绝了,因为从api加载数据需要很长时间(很多记录要保存到我的数据库)。因此,我决定使用预填充的sqlite数据库交付我的应用程序,以防止对象的初始加载 首先,我检查了这个网站,了解如何在我的项目中插入我的数据库。 我认为该站点没有更新,因为在ios7中,创建的数据库在缓存文件夹中包含3个不同的文件 数据库 数据库墙 数据库shm 我应该使用哪一个来导入? 其次,我应该如何读取数据库文件并从中复制/创建数据库? 我当前的数据库是使用CoreD

我对ios世界真的很陌生,我有一个应用程序被苹果拒绝了,因为从api加载数据需要很长时间(很多记录要保存到我的数据库)。因此,我决定使用预填充的sqlite数据库交付我的应用程序,以防止对象的初始加载

首先,我检查了这个网站,了解如何在我的项目中插入我的数据库。

我认为该站点没有更新,因为在ios7中,创建的数据库在缓存文件夹中包含3个不同的文件

  • 数据库
  • 数据库墙
  • 数据库shm
我应该使用哪一个来导入? 其次,我应该如何读取数据库文件并从中复制/创建数据库? 我当前的数据库是使用CoreData创建的,当我尝试复制/创建导入的数据库时会出现问题吗


欢迎使用教程和代码片段:)

您需要记住的第一件事是,您确实应该使用核心数据创建这个预填充的数据库

为了避免有三个文件,创建数据库的工具需要正确地关闭它。这里有更多的信息

我不知道,如果您正确地拆掉核心数据堆栈,核心数据是否会这样做,但它可能应该这样做。如果不能做到这一点,请尝试打开和关闭使用sqlite实用程序创建核心数据的数据库

你应该如何在应用程序中使用它取决于你的应用程序。如果这是用户应该继续填充数据库的初始状态,则可以在初始化核心数据堆栈之前将文件复制到适当的位置(如应用程序数据子文件夹)

另一种情况是,该数据库是一个示例数据库,如照片库,其中包含用户在开始使用应用程序时不应保存的照片。在这种情况下,我建议将此数据库和用户数据库分开


第三种情况是,这个数据库是一个很大的目录。并且用户会向其中添加其他条目。您可能希望在不接触用户条目的情况下不时更新此目录。在这种情况下,我还建议不要将用户数据与此目录混合。

经过几次研究和测试,我成功地做到了这一点

因此,根据我问题中的链接,我将sqlite数据库添加到项目中。 我发现这篇有用的文章几乎完成了任务

因此,我修改了AppDelegate上的persistentStoreCoordinator方法,添加了以下代码 我对旧数据库的数据库请求工作正常

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };

if (_persistentStoreCoordinator != nil) {
    return _persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyDB.sqlite"];

NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]])
{
    NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"MyDB" ofType:@"sqlite"]];
    NSError* err = nil;

    if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err])
    {
        NSLog (@"Error - Could not preload database.");
    }
}

它并不完全是重复的,但我在这里的回答涵盖了为什么这些文件不同,以及在这种情况下应该做什么: