【问题标题】:NSDocumentDirectory or NSBundle resourcePath with Sqlite?NSDocumentDirectory 或 NSBundle resourcePath 与 Sqlite?
【发布时间】:2011-10-01 19:49:23
【问题描述】:

我想知道为什么我们首先在这里使用 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];

两者有什么区别?

【问题讨论】:

    标签: objective-c sqlite nsbundle nsdocumentdirectory


    【解决方案1】:

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

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

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

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

    有意义吗?

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 非常感谢!关于这个“图形工具”,你怎么能得到它?再次感谢
      • 有一些你可能最好的谷歌搜索和尝试一些,但我个人喜欢 Firefox 的 SQL 管理器插件做得很好。它不适用于 ERD,但您可以比仅使用命令行更轻松地查看和操作表。
      猜你喜欢
      • 2023-03-18
      • 2011-12-24
      • 1970-01-01
      • 2014-02-25
      • 2015-03-11
      • 1970-01-01
      • 2011-03-05
      • 2016-08-19
      • 1970-01-01
      相关资源
      最近更新 更多