【问题标题】:Where to put SQLite database to keep it from being over-ridden during update on OS X?在 OS X 上更新期间将 SQLite 数据库放在哪里以防止它被覆盖?
【发布时间】:2013-01-02 21:48:03
【问题描述】:

我正在开发我的第一个 OS X 应用程序,它将通过 Mac App Store 分发。

该应用程序使用了一个 sqlite 数据库,我目前将其保存在与其他应用程序文件依赖项相同的位置。

我正在使用 Qt Framework 开发应用程序。

保持在 App Store 规则的范围内;

  • 在哪里可以找到数据库文件以使其在应用程序更新期间不会被覆盖?

  • 我应该如何构建 .app 文件夹和所有依赖项?

谢谢。

【问题讨论】:

    标签: macos sqlite qt osx-lion osx-mountain-lion


    【解决方案1】:

    您的问题暗示您正在写入 sqlite 数据库,这是一个坏主意,因为应用程序将存储在用户可能没有写入权限的位置 (/Applications)。

    您应该做的是在第一次使用时(或者当您检测到它不存在时)将数据库复制/创建到用户可写区域(应用程序容器的 Documents 文件夹将执行此操作)并从那里使用它。

    编辑:为了获取 Documents 目录,请使用以下代码:

    NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    

    这将为您提供应用容器Documents 目录的位置,而不是应用被沙盒化时用户的 Documents 目录:

    ~/Library/Containers/com.yourdomain.yourapp/Data/Documents
    

    【讨论】:

    • 你好@trojanfoe。你的猜测是绝对正确的,这就是我要做的。我认为 Apple 的新 App Store 政策要求将应用程序沙盒化,而不能访问其他任何地方?所以基本上可以安全地将 db 等放入应用程序在 Documents 中创建的应用程序文件夹?
    • 是的,虽然应用程序支持会比文档更好。
    • @Phil 请看我的编辑。正如 noa 指出的那样,应用程序支持可能是一个更好的地方,但是当应用程序被沙盒化时,它可以完全访问自己的容器,所以我不确定它是否很重要(如果我错了,请纠正我)。
    • @trojanfoe,感谢您极快的响应和最近的编辑,非常有帮助。并感谢 noa 的超快速输入(评论后 4 秒 ;-))
    • 而不是硬编码你应该使用 NSSearch API 的路径: NSString * supportDir = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2011-08-23
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多