gpt4 book ai didi

swift - 如何授予我的 MacOS 应用程序创建 "WAL"文件的权限,以使用 journal-mode=WAL 打开 SQLite 数据库?

转载 作者:行者123 更新时间:2023-12-05 07:16:07 28 4
gpt4 key购买 nike

我是一名经验丰富的程序员,但这是我的第一个 MacOS 应用程序(在 10.15.2 上),它需要读取用户选择的 sqlite 数据库(可能在机器上的任何地方)

起初它不会自己打开数据库“name.sqlite”文件;但是当我使用 NSOpenPanel 让用户选择它时,它起作用了。

但随后查询失败,因为 sqlite3(通过 SQLite.swift)试图打开 'name.sqlite-wal'

os_unix.c:43353: (0) open(/path/to/dbname.lrcat-wal) - 未定义错误:0

如果我使用命令行客户端和 pragma journal-mode=off 打开数据库,那么应用程序可以正常工作,但我不能基于此限制应用程序 - 大多数dbs 有 WAL 日志记录

我尝试在 app.entitlements 中将 com.apple.security.app-sandbox 设为 false,但这没有帮助。

我尝试将数据库移动到 Pictures 文件夹并将 com.apple.security.assets.pictures.read-write 设为 true,但这没有帮助。

db 和包含文件夹(在我的测试中为/tmp)的 unix 权限都很好。

因为允许用户通过 NSOpenPanel 选择数据库允许我打开数据库进行读取,我假设在创建用于写入的“-wal”文件时也有类似的限制。

我怎样才能获得在数据库旁边创建文件的权限(最好不要打扰用户了解 wal 文件的详细信息)?


编辑:按照 TheNextMan 关于 sidecar 文件的建议,我再次搜索。他(猜代词) 链接的 WWDC 演示文稿展示了如何使用 CFBundleDocumentTypes 将额外的扩展与 NSIsRelatedItemType for NSFilePresenter 相关联>,但是(据我所知)我不会走那条路。我试过了,但没用

我还使用“sidecar”搜索词找到了 Access sidecar files in a Mac sandboxed app ,这看起来不错,但没有帮助。

更好的是,我找到了我的问题的四年未回答的副本(如果我有足够的代表,我会将其标记为重复)SQLite and Sandboxed OSX apps ,其中引用了 Apple 文档 App Sandbox Design Guide , 说

Note: In the case of a SQLite journal file, beginning in 10.8.2, journal files, write-ahead logging files, and shared memory files are automatically added to the related items list if you open a SQLite database, so this step is unnecessary.

显然它应该 Just Work™。但事实并非如此。

最佳答案

感谢您提出这个彻底的问题。我今天遇到了和你一样的问题,与 macOS 沙盒限制作斗争。与您类似,我已经将用户选择的 (NSOpenPanel) 数据库复制到我的应用程序临时文件夹 (FileManager.default.temporaryDirectory)。
但我仍然无法查询数据库文件:sqlite3_prepare_v2 总是返回 os_unix.c:45340: (0) open(/var/folders/.../myDB.db-wal ) - 未定义错误:0 消息。

由于数据库已经位于临时文件夹中,我们的应用程序绝对可以写入该文件夹(因为我们复制了数据库文件!),我们可以简单地自己创建 myDB.db-wal 文件:

let tmpLocation = /// URL of the SQLite *.db file in a writable directory
let walLocation = tmpLocation.deletingPathExtension().appendingPathExtension("db-wal")
try Data().write(to: walLocation)

Et voilà:正在打开数据库。

关于swift - 如何授予我的 MacOS 应用程序创建 "WAL"文件的权限,以使用 journal-mode=WAL 打开 SQLite 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com