【问题标题】:Framework in MacCatalyst app fails to open sqlite fileMacCatalyst 应用程序中的框架无法打开 sqlite 文件
【发布时间】:2021-06-29 12:55:50
【问题描述】:

我正在制作一个需要从sqlite 文件加载一些数据的框架。它在 iOS 上运行良好,但在 Mac Catalyst 上无法打开文件并出现以下错误:

[NavigationDataProvider.swift:37] createDB() - NavigationData has been loaded from path /Users/username/Library/Developer/Xcode/DerivedData/AppName-finyqxyzgukrabcenmuloduaikbf/Build/Products/Debug-maccatalyst/NavigationData.framework/Resources/navdata.sqlite
2021-06-29 15:50:19.857298+0300 AppName[18534:531626] [logging-persist] cannot open file at line 45068 of [d880193994]

该文件似乎不存在,但如果我从 Mac 上的终端手动检查它,它确实存在:

% file /Users/.../navdata.sqlite: SQLite 3.x database, last written using SQLite version 3035005

那么这是 Mac Catalyst 的某种权限问题吗?不应该,因为该文件包含在框架包中,但它仍然不起作用。请问有什么想法吗?

我得到这样的路径:

Bundle(for: NavigationDataProvider.self).path(forResource: "navdata", ofType: "sqlite")

我也尝试过Bundle.main,但没有成功。我在 Xcode 的生产版本和最新的 Xcode-beta 上都试过这个,结果相同。

【问题讨论】:

  • 但是现在我查看路径,它实际上指向../Developer/Xcode/DerivedData/,这不是应用程序的安装位置。为什么?
  • @EricAya Bundle(identifier: "com.xxx.NavigationData") 导致同样的问题。路径在 Developer/Xcode/DerivedData 中,尝试运行查询时出现相同的错误。
  • 我只是在这里玩一个预感。您是否将数据库(或添加文件)拖到 Xcode 项目中?
  • 不记得了,应该没关系,因为它包含在目标中?我的意思是,Xcode 应该将文件复制到包中,然后将包复制到设备/模拟器上,而不是直接访问文件...

标签: swift sqlite mac-catalyst


【解决方案1】:

发现问题。您不能直接访问捆绑包中的 sqlite 文件,您必须先将文件从捆绑包中复制出来。事后看来,这很明显,因为 sqlite 可能会尝试以读写模式打开文件,而这对包内的文件不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2018-05-15
    • 2013-06-07
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多