qt qml:使用.qrc文件将sqlite数据库部署到android无法正常工作

时间:2017-08-11 03:59:07

标签: android c++ qt sqlite qml

我试图在QtCreator上使用qml和C ++创建一个Android应用程序,我无法将sqlite数据库部署到android:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
QFile file(":/patients.db") ;
if (file.exists()) {
    file.copy("./patients.db") ;
    QFile::setPermissions("./patients.db",QFile::WriteOwner | QFile::ReadOwner) ;
} else qDebug() << "the file does not exist" ;
db.setDatabaseName("./patients.db");

patinets.db存在于QtCreator的qrc树下,代码可以在我的开发主机上运行(Linux ubunntu)

但是在android上,调试消息&#34;文件不存在&#34;打印出来。

我在这里错过了什么吗?!这样做的正确方法是什么? 谢谢。

1 个答案:

答案 0 :(得分:1)

如果您在“部署”的每个步骤中检查状态返回代码,这将非常有用。 file.copy()QFile::setPermissions()都成功显示返回值。

非常有可能,已经file.copy("./patients.db")失败了,因为在Android上你不允许在包含二进制文件/ apk的同一目录中创建任何文件。

您需要在运行时获取为应用分配的内部存储路径。 Link to 'Saving Files' of Android docs。 您应该通过QStandartPath(例如AppLocalDataLocation)获取正确的路径。

你可以获得一个可能的目标目录并将你的sqlite文件放在那里:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
QFile file(":/patients.db") ;
QString patientDbPath;
if (file.exists()) {
    patientDbPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    if (patientDbPath.isEmpty())
    {
        qDebug() << "Could not obtain writable location.";
        return;
    }
    patientDbPath.append("/patients.db");
    file.copy(patientDbPath) ;
    QFile::setPermissions(patientDbPath ,QFile::WriteOwner | QFile::ReadOwner) ;
} else qDebug() << "the file does not exist" ;
db.setDatabaseName(patientDbPath);