研究了1一天多,白天黑天的,总算努力没有白费,实现了安卓9.0手机调取sqlite3数据库
就是图标是这个玩意的尾缀是db的东东。
正文开始前先发两个连接,都是大牛的帖子,很不错的参考,一个是直接说明怎么调取数据库的,但是说的不是很详细,所以一般很难理解,并且很难实现https://bbs.csdn.net/topics/391900605
还有一个是和数据库无关的, 只是 说明如何将文件打包到apk中,并调取他,和这个博主也探讨了几个来回,问题也是从金口中 解决的,很感谢这位博主Qt for Android / ios 将图片或文件打包进安装包中_luoyayun361的博客-CSDN博客
话不多说,正文开启:
首先是保证你电脑上的qt for Android配置齐全
其次,问题就是怎么把数据库db文件放到手机中,当然不可能通过数据线去传输放到指定位置,因为最终你只有一个apk安装文件,没有任何东西让你去附加,所以就要把文件放到apk里。
在pro文件中加上图中那句话
aaa是一个文件夹,与pro文件同级目录,把你 想要打包的db数据库文件放到aaa文件夹中去,第二行111.png 是一个图片,没有用可以不加,我测试用的。
第三行意思是把aaa中的zc.db文件最终放在了程序编译后生成的Android-build文件夹 中的assets文件夹中的bbb文件夹中,意思就是打包到了apk文件中的assets/bbb/中
最后一行是可以随便定义的,就按照我这个来就可以了。
这样以后就可以把 你在电脑上 处理好的初始化数据库文件打包到手机中了,接下来就是如何在程序中去调用这个文件也是比较关键的,因为我一个手机root一个手机 没root,root的手机可以通过re文件管理器很方便的查到路径,没root的手机就无法验证这个路径了,好不好使都不知道像一个瞎子一样在各种路径尝试。
QSqlDatabase db;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
db = QSqlDatabase::addDatabase("QSQLITE", "zc_data");//1
QFile file("/storage/emulated/0/data/zc.db");//2
if(!file.exists()||file.size()==0){//3
QFile::copy("assets:/bbb/zc.db", "/storage/emulated/0/data/zc.db");//4
file.setPermissions(QFile::ReadUser | QFile::WriteUser);//设置权限//5
}
db.setDatabaseName("/storage/emulated/0/data/zc.db");//6
db.open();//7
MainWindow w;
w.show();
return a.exec();
}
在main函数中添加打开数据库文件的代码,在以后的程序中只管各种查表调用即可
在程序中我备足了1-7注释,分别叙述一下每行的作用,都是必不可少的。
1.首先添加一个 数据库文件,这句话得有,没有就是不好使,不知道为啥。
2.这句话的作用是定义一个file,并且给他指定一个目录/storage/emulated/0/data/zc.db,前面的“/storage/emulated/0”是指手机外部存储的固定路径,不管你是安卓几,本机自带外部存储都是这个基本路径, 带插入SD卡的手机除外,没试过。
3.这句话的作用就是为了判断file路径下的文件是否存在,或者是否为空文件,因为在app第一次安装的时候是没有的,所以db不存在,所以会进入if中执行语句,如果你安装好app后,再次打开这个app,系统同样会执行到这里,就不会 进入if中,所以这句话很重要,就是为了 避免每次打开程序,都把app安装包内带有的db文件覆盖到指定地址上。
4.如果第一次安装,就会执行这句话,将安装包中的db文件复制到手机外部存储设备上的data中
5.将手机存储中data文件 中的db文件设置可读写权限,后来发现不用设置也带读写 功能。没去试验不加这句话怎么样,反正加了不会出错,还保险一些。
6.选中指定路径下的db文件
7.打开指定路径下的db文件
通过以上步骤 , 就把打包在assets中bbb 文件夹中的db文件移植到了手机存储空间中,以后程序调用就调用手机存储空间的db文件了。接下来演示一下成功 调取的例子
QSqlQuery qry(db);
QString sql;
sql="select * from lastlog";
if(qry.exec(sql)){
if(qry.next()){
ui->textEdit->setText(qry.value(1).toString());
}
}
ui->textEdit->setPlaceholderText(tr("*************"));
上面的代码应该在熟悉不过了,和win上的用法就没有区别了
如图db中的lastlog表中第 二列是username,程序将其读取出来显示在label中,手机app运行效果如下
然后去查看一下手机存储中的data文件中数据库文件
就是这个啦。
2019年5月24日22:50:31补充
如果失败,请检查安装程序是否授权读写权限,询问不行,只能设置允许
在或这在main.cpp中添加如下代码,然后在main函数中调用,打开程序会询问是否开启权限
bool checkPermission() {
QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
if(r == QtAndroid::PermissionResult::Denied) {
QtAndroid::requestPermissionsSync( QStringList() << "android.permission.WRITE_EXTERNAL_STORAGE" );
r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
if(r == QtAndroid::PermissionResult::Denied) {
return false;
}
}
return true;
}