1

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

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

稍后我们使用 NSBundle 中的这次 resourcePath 将这条路径与另一条路径进行比较:

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

两者有什么区别?

4

2 回答 2

1

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

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

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

第一段代码只是构建目标路径(一个字符串);第二个块构建源路径(一个字符串),然后制作副本。

是否有意义?

于 2011-07-09T10:38:26.497 回答
1

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

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

  1. 代码的第一部分只是为您提供您希望sqlite文件在documents目录中所在位置的路径。最终被关押在writableDBPath.

  2. 接下来,您从bundle( defaultDBPath) 获取路径并使用这两个路径

    ... copyItemAtPath:defaultDBPath toPath:writableDBPath ...
    

这为您提供了您在捆绑包中提供的读/写数据库。你为什么要这样做而不是SQL在设备上运行你的来创建模式?这允许您使用一些数据预置数据库。有时使用图形工具来设置和编辑你的 sqlite 文件会更容易

于 2011-07-09T12:46:53.027 回答