开发环境:
macOS 10.12.1
Xcode 8.1
Qt 5.8
iPhone 6S+iOS 10.1.1
源代码:
我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10、Android、macOS 下正常运行,但是在苹果手机上报错。
QSqlDatabase db;
db.setDatabaseName("farmer.db"); // 创建数据库
问题:
在模拟器上可以正常访问 SQLite 数据库,但是在真机上不行,提示如下错误:
QSqlDatabasePrivate::database: unable to open database: "out of memory Error opening database"
解决方法:
1、因为我对苹果的开发环境一无所知,只能使用百度大法,初步确认是访问权限的问题,我从这里了解了 iOS 的沙盒目录结构:http://blog.csdn.net/iunion/article/details/46889073
于是我修改了下代码,直接在 Documents 目录生成数据库文件,还是出错。
db.setDatabaseName("../Documents/farmer.db");
// 创建数据库
2、继续百度出来的建议是把已经生成好的数据库文件直接部署到应用程序中,然后用代码拷贝到 Documents 目录下。
于是 Qt 编译完之后,我用 Xcode 打开项目,把数据库文件 farmer.db 加到 Resources 中,
这样部署到真机上之后,确实有 farmer.db 文件了,我使用 QDir::currentPath() 获取应用的路径,然后
QStringdestFile=QDir::currentPath()+"/Documents/farmer.db";
QFile::copy("farmer.db", destFile);
复制文件时报错,又换了 QCoreApplication::applicationDirPath() 获取应用的路径,也不行。这两个函数获取的路径是一样的。这个路径不是我需要的路径。
这样程序就顺利的运行起来了。
4、是不是也可以在 Documents 目录下直接生成数据库文件呢?试验了一下,是可以的,这样就不用再打包数据库和拷贝文件了。
5、另外,再善后一下,为了让程序跨平台,对不同的操作系统分别处理,iOS 系统中,数据库文件放到 Documents 目录,其他系统直接放到程序目录下。
QString destFile = "farmer.db";
#ifdef Q_OS_IOS
qDebug("操作系统:iOS");
destFile = QDir::homePath() + "/Documents/farmer.db";
#else
qDebug("操作系统:非 iOS");
#endif
#ifdef Q_OS_IOS
qDebug("操作系统:iOS");
destFile = QDir::homePath() + "/Documents/farmer.db";
#else
qDebug("操作系统:非 iOS");
#endif
解决这个问题,花费了我1天半的时间。记录一下,坚持每天进步一点点。