2014-01-10 128 views
1

我真的是新来的ios世界,我有一个苹果拒绝的应用程序,因为它需要很长时间从api加载数据(大量的记录保存到我的数据库)。所以我决定用预填充的sqlite数据库来交付我的应用程序,以防止初始加载对象。阅读预先填充的Sqlite.db在ios7

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

我不认为该网站是更新,因为在ios7创建的数据库配备了3个不同的文件的缓存文件夹

  • 数据库
  • 数据库沃尔玛
  • 数据库SHM

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

教程和代码片断,欢迎:)

+0

这不完全重复,但在这里我的回答涵盖了为什么这些文件是不同的,你应该在这种情况下怎么做:http://stackoverflow.com/questions/20687547/nsmanagedobjectcontext-not-saving-properly -to-sqlite的/ 20692638#20692638 –

回答

1

经过一些研究和测试,我设法做到了。

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

所以我修改了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."); 
    } 
} 
1

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

为了避免有三个文件,创建数据库的工具需要正确关闭它。以下是SQLite website的更多信息。

我不知道Core Data是否会正确拆除Core Data堆栈,但它可能应该这样做。如果不这样做,请尝试打开并关闭使用sqlite实用程序创建的Core Data的数据库。

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

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

第三种情况是这个数据库是什么东西的大目录。用户添加额外的条目。您可能需要不时更新此目录而不触及用户的输入内容。在这种情况下,我还建议不要将用户数据与此目录混合使用。