最近折腾上了用Qt写安卓, 恰好要在安卓上用sqlite, 一开始以为和桌面写法差不多,然而跨到了安卓之后死活打不开数据库,于是便开始了各种折腾, 首先要说一下, 我使用的是Qt自带的数据库操作库: 使用QSqlDatabase
建立连接, 然后使用QSqlQuery
操作sqlite. 还有一个要说明的是: 使用QSqlDatabase
打开数据库吧,如果他发现没有这个数据库,他便会给你新建一个大小为0k的同名数据库….,这就会导致: 数据库明明能打开却找不到表这种坑爹情况… 我一开始就忽略了这个问题坑了好久….
咳咳, 如果想通过qt在安卓上用sqlite据说有两种方法, 其一种是使用qrc,也就是qt那跨平台的资源机制,这东西我一直没搞懂怎么用, 一开始我照着qt使用在qrc里的qml文件一样去调用我在qrc里的db文件,然并卵,用它存些图片还好,但存上数据库我就….
所以我用了另一种方法,大概思路是利用安卓的assets文件夹:把数据库丢到安卓构建目录下的assets
文件夹下,这样在打包成APK时候Qt自己就会把数据库打包到APK里头.然后在程序运行的时候给他拷到安卓本地的目录里头,咱就能用辣~
开始我十分傻逼的直接database文件丢到了assets文件夹下,然后我发现每次编译这个文件夹都会被qt删掉重新整一个….(目瞪口呆.jpg) 所以我需要一个特别的方法把数据库整进去..
查了一圈问了几个大佬之后,得知你需要在pro文件里头写点东西:
|
|
如果你已经手动或用Qt的生成工具生成了AndroidManifest.xml
文件以及它的小伙伴们,如果没有自动生成QMake命令的话别忘了在.pro里写(详细请:http://doc.qt.io/qt-5/deployment-android.html):
|
|
这样就会把你代码目录下的qrc目录下的SQL.db文件拷贝到安卓构建目录assets文件夹下的db文件夹下 , 不知道我表述清楚没有, 我觉得这是一个能在编译的时候把你的文件当做成源文件的本身一部分的一种操作, 这样就会在变编译的时候帮你把你的文件复制到assets文件夹下.(但对于多个数据库来讲还有更好的方法吗?)
然后就是给他拷到安卓本地目录里头:
|
|
在assets
文件夹下的东西都要通过assets:
来访问, (我试图用qrc:
的方式来访问qrc里头的数据,然而我失败了,明明它自己的示例这么访问qml文件都好使), 注意copy
函数会将数据库拷贝到安卓的:/data/data/你的工程名(默认是org.qtproject.example.你项目名)/files/
下.
接下来就是打开数据库:
顺带说一下数据库的操作, 用QSqlQuery
类就成, 这个类有个exec()
函数, 可以直接传递数据库操作命令给他:
再来个获得数据里的数据的例子:
但是如果获取一些别的信息QSqlQuery
可能就不成了,比如获得一个表里有几条数据, 需要使用QSqlQueryModel
这个类:
具体请参阅Qt文档与论坛 以及其他文献:
Problem deploying sqlite database to my android device
Platform and Compiler Notes-Android: http://doc.qt.io/qt-5/platform-notes-android.html
QSqlQuery: http://doc.qt.io/qt-4.8/qsqlquery.html
QSQLDatabase: http://doc.qt.io/qt-5/qsqldatabase.html
QSqlQueryModel: http://doc.qt.io/qt-5/qsqlquerymodel.html
谢谢观看,如有错误以及建议以及不满以及吐槽以及勾搭以及撩我请在博客的lssues上指出