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 数据库就没有问题了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)