我想知道为什么我们首先在这里使用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];
两者有什么区别?
答案 0 :(得分:1)
“比较”这两条路径是什么意思?
我看到的是从应用资源目录到用户文档目录的文件副本。
所以发生的事情是,与应用程序捆绑在一起的默认版本Sports.sqlite
(因此在资源目录中可用)将被复制到用户可以修改它的用户目录中。 / p>
第一块代码只是构建目标路径(一个字符串);第二个块构建源路径(一个字符串),然后进行复制。
有意义吗?
答案 1 :(得分:1)
在这种情况下,您(通常仅一次,除非您需要还原数据库)将数据库从只读包复制到文档目录中,以便用户可以读/写它。如果您想预先设定数据库种子或只是设置结构,这非常有用。
您的文档目录是可读/写的,而bundle
不是sqlite
,因此您需要在documents
目录中使用sqlite
才能正确使用它。
代码的第一部分只是为您提供documents
文件在writableDBPath
目录中所在位置的路径。最终将在bundle
举行。
接下来,您将从defaultDBPath
(... copyItemAtPath:defaultDBPath toPath:writableDBPath ...
)获取路径并使用这两条路径
SQL
这为您提供了捆绑中提供的读/写数据库。为什么要这样做而不是在设备上运行{{1}}来创建架构?这允许您使用某些数据预先设定数据库种子。使用图形工具设置和编辑sqlite文件有时会更容易