带有Sqlite的NSDocumentDirectory或NSBundle resourcePath?

时间:2011-07-09 10:19:54

标签: objective-c sqlite nsbundle nsdocumentdirectory

我想知道为什么我们首先在这里使用NSDocumentDirectory搜索路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);  
NSString *documentsDirectory = [paths objectAtIndex:0];  
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Sports.sqlite"];

稍后我们将此路径与另一个路径进行比较,使用来自NSBundle的这个时间资源路径:

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] 
                                        stringByAppendingPathComponent:@"Sports.sqlite"];  
success = [fileManager copyItemAtPath:defaultDBPath
                               toPath:writableDBPath error:&error];

两者有什么区别?

2 个答案:

答案 0 :(得分:1)

“比较”这两条路径是什么意思?

我看到的是从应用资源目录到用户文档目录的文件副本。

所以发生的事情是,与应用程序捆绑在一起的默认版本Sports.sqlite(因此在资源目录中可用)将被复制到用户可以修改它的用户目录中。 / p>

第一块代码只是构建目标路径(一个字符串);第二个块构建源路径(一个字符串),然后进行复制。

有意义吗?

答案 1 :(得分:1)

在这种情况下,您(通常仅一次,除非您需要还原数据库)将数据库从只读包复制到文档目录中,以便用户可以读/写它。如果您想预先设定数据库种子或只是设置结构,这非常有用。

您的文档目录是可读/写的,而bundle不是sqlite,因此您需要在documents目录中使用sqlite才能正确使用它。

  1. 代码的第一部分只是为您提供documents文件在writableDBPath目录中所在位置的路径。最终将在bundle举行。

  2. 接下来,您将从defaultDBPath... copyItemAtPath:defaultDBPath toPath:writableDBPath ... )获取路径并使用这两条路径

    SQL
  3. 这为您提供了捆绑中提供的读/写数据库。为什么要这样做而不是在设备上运行{{1}}来创建架构?这允许您使用某些数据预先设定数据库种子。使用图形工具设置和编辑sqlite文件有时会更容易