zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

qt for Android数据库连接sqlite3

2023-09-27 14:29:08 时间

研究了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;
}