如何在QT中将SQLite导出为apk?

3
我正在使用Qt开发一款Android应用程序。
我已经在MinGW上运行并发布到了Android构建环境。我的应用程序对SQLite数据库进行了选择、插入和更新操作,在MinGW中可以正常工作,但是当我导出到Android时就没有效果了。
我已经将SQLite文件复制到assets目录下,但我无法读取SQLite文件。
1个回答

1
在将数据库文件添加到assets文件夹后,您还应该将这些内容添加到您的.pro文件中:
deployment.files += myfile.sqlite
deployment.path = /assets
INSTALLS += deployment

但是assets中的文件是只读的。因此,您应该先将其复制到其他位置。这可以在第一次应用程序启动时完成:
QFile dfile("./myfile.sqlite");
if (!dfile.exists())
{
     QFile::copy("assets:/myfile.sqlite", "./myfile.sqlite");
     QFile::setPermissions("./myfile.sqlite",QFile::WriteOwner | QFile::ReadOwner);
}

您也可以使用Qt资源系统,这是一个跨平台的解决方案。默认情况下,所有Qt应用程序都可以使用“:/”前缀或URL方案前缀“qrc:”访问qrc文件的内容。因此,您只需要将sqlite文件添加到项目资源文件中,然后将其复制到某个位置并在之后使用它即可。
QFile dfile("./myfile.sqlite");
if (!dfile.exists())
{
     QFile::copy(":/myfile.sqlite", "./myfile.sqlite");
     QFile::setPermissions("./myfile.sqlite",QFile::WriteOwner | QFile::ReadOwner);
}

谢谢你的建议,Nejat。我之前已经尝试过了 :) 这个链接:https://dev59.com/03_aa4cB1Zd3GeqP1UsQ 。但是还没有什么头绪。 - DJ.Yosemite
Nejat,我把你的代码放在数据库查询之前。每个查询都将受到此代码的影响。这是一个错误吗? - DJ.Yosemite
@DJ.Yosemite 上述代码应该在调用 QSqlDatabase::addDatabase 之前执行。if语句中的代码仅在应用程序第一次启动时运行一次。 - Nejat
这段代码在每次打开应用程序时运行。我已经将代码放在主块中 :( - DJ.Yosemite
@DJ.Yosemite 请尝试检查QFile::copy的返回值,以查看文件是否成功复制。 - Nejat
我现在使用了“使用Gradle”选项。但是还有另一种方法。 - DJ.Yosemite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接