我试图在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;打印出来。
我在这里错过了什么吗?!这样做的正确方法是什么? 谢谢。
答案 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);