irpas技术客

Delphi 开发 iOS APP 的文件发布的问题_pcplayer_delphi 苹果开发

irpas 7966

Delphi 写 iOS APP 嵌入 SQLite 数据库到 APP 里面作为 APP 的本地数据库

Delphi 10.4.2 社区版。

开发环境配置好以后,在 Delphi 里面可以直接按 F9 把程序下载到 iPhone 上跑起来。

但问题来了,我的程序用到了 SQLite,结果打开数据库出错。单步跟踪,发现情况是:

FDConnection1.Open 执行正确,异常出在 FDQuery1.Open 上面。错误提示是 XX 表不存在。这个 XX 表就是 FDQuery1 里面的 select * from XX 这个表。

这个信息误导了我,以为数据库打开了,表不在。同时,在 MAC 端的 PAServer 里面出现错误信息:error:?Project1?::?Class?'TFDDatSManger'?has?a?base?class?'Firedac::Dats::TFDDatSNamedObject?which?does?not?have?a?complete?definition.

让我以为是 FireDAC 有什么配置在 iOS 底下需要特别留意。

然后网上到处查资料,把英巴的官方文档和 iOS 有关的以及和 FireDAC 有关的读遍了也没发现问题在哪里。

反复测试,换 Delphi 11 测试,问题依旧。但是,反复测试也带来新的情况,新的情况是 FDConnection1.Open 出现异常了。这下我才怀疑数据库文件根本不存在。

加上 FileExists 函数去判断,果然数据库文件不存在。既然不存在,那之前为什么数据库连接又能成功执行?为啥现在又不能成功执行了?奇怪。

然后开始查文件不存在的原因。英巴的官方文档里面有关 SQLite 数据库在 iOS 里面跑到文档里,没有提到有用信息。最后查到某些说法,说发布的目标地址 Remote Path 应该是?StartUp\Documents。这里,当时我选择的是?./assets/internal/,实际上,这里下拉,只有?./assets/internal/ 一个可以选择,而且在做安卓程序的时候选择这个是正确的。

当然,按照网上的说法(非官方的),填入?StartUp\Documents,文件依旧不存在。聪明如我,当然会想到,应该模仿?./assets/internal/,前面加上 ./ 后面加上 /

马上测试,输入?.\StartUp\Documents\ ,编译运行,在 iPhone 上能够成功打开数据库。

结论:

1. SQLite 的数据库文件 MyDB.db 要和 APP 一起安装到手机里面,在 Delphi IDE 的菜单 Project --> Deployment -- 打开这个 Deployment 窗口,在里面添加要安装的文件 MyDB.db,这个文件的 Remote Path 要手动填入?.\StartUp\Documents\ ,下拉选择没有这一项。

2. 文件安装到哪里了呢?APP 要打开文件去哪里读取?文件在APP 采用?TPath.GetDocumentsPath 获得的目录底下。

3. 重复一次:发布的时候,要和 APP 一起发布的文件,在 IDE 的 Deployment 窗口里面添加文件名后,该文件对应的 Remote Path 填入??.\StartUp\Documents\ ,APP 安装后,文件在 APP 的 TPath.GetDocumentsPath 目录底下。

4. 这个 TPath.GetDocumentsPath 在 Delphi 的程序框架里,默认不存在,必须要 uses System.IoUtils 这个单元。

5. 对于 FireDAC 来说,代码不能写死数据库在哪里。代码要这样写:

S := TPath.Combine(TPath.GetDocumentsPath, 'MyDB.db'); FdConnection1.Params.Database := S;

到这里,采用 FireDAC 在 APP 里面使用和 APP 一起打包的 SQLite 数据库就没有问题了。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #delphi #苹果开发 # #iOS #APP #嵌入 #sqlite