我是一个经验丰富的程序员,但这是我的第一个MacOS应用程序( 10.15.2),它需要读取用户选择的sqlite (可能在机器上的任何地方)
起初,它不会打开DB 'name.sqlite‘文件本身;但是当我使用NSOpenPanel让用户选择它时,这就奏效了。
但是查询失败了,因为sqlite3 (通过SQLite.swift)试图打开‘name.sqlit-Wal’
os_unix.c:43353: (0) open(/path/to/dbname.lrcat-wal) - Undefined error: 0
如果我使用命令行客户端打开db,并且使用pragma journal-mode=off,那么应用程序可以正常工作,但我不能以此为基础限制应用程序--大多数dbs都有WAL日志记录。
我试着在com.apple.security.app-sandbox中把app.entitlements变成假的,但这并没有帮助。
我尝试将db移动到Pictures文件夹并将com.apple.security.assets.pictures.read-write变为true,但这并没有帮助。
db的unix权限和包含的文件夹(我的测试中的/tmp)都很好。
因为允许用户通过NSOpenPanel选择数据库,所以我可以打开数据库进行读取,因此我假设在创建用于写入的'-wal‘文件时也有类似的限制。
我如何获得创建数据库旁边的文件的权限(理想情况下不会让用户对wal文件的详细信息感到困扰)?
编辑:遵循TheNextMan关于sidecar文件的建议,我再次搜索。他(猜代词)链接的WWDC演示文稿展示了如何使用CFBundleDocumentTypes将额外的扩展与NSIsRelatedItemTypefor NSFilePresenter联系起来,但是(据我所知)我没有经过这条路线。我试过了,但没什么用
我还用"sidecar“搜索术语找到了访问Mac沙箱应用程序中的侧文件,它看上去不错,但没有帮上忙。
更好的是,我找到了我的问题的四岁大的未回答的副本(如果我有足够的代表,我会把它标记为副本),SQLite和沙箱OSX应用程序,其中包括来自Apple 应用程序沙箱设计指南的一段话,说
注意:对于SQLite日志文件,从10.8.2开始,如果打开SQLite数据库,日志文件、预写日志文件和共享内存文件将自动添加到相关项列表中,因此这一步骤是不必要的。
所以很显然,它应该只起作用,™。但事实并非如此。
发布于 2021-11-19 21:54:58
谢谢你提出这个详尽的问题。我今天遇到了和您一样的问题,对抗macOS沙箱限制。与您类似,我已经将用户选择(NSOpenPanel)数据库复制到我的应用程序临时文件夹(FileManager.default.temporaryDirectory)。
但是我仍然无法查询数据库文件:sqlite3_prepare_v2总是返回os_unix.c:45340: (0) open(/var/folders/.../myDB.db-wal) - Undefined error: 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)打开DB正在工作。
https://stackoverflow.com/questions/59395521
复制相似问题