精华内容
下载资源
问答
  • 在linux下qt中sqlite
    2021-05-16 11:31:53

    作者:zieckey([email]zieckey@yahoo.com.cn[/email])

    All Rights Reserved

    下文介绍的内容都是基于 Linux RedHat 9.0 平台的。

    1. 说明

    这里我们假设你已经编译好了sqlite的库文件 :

    libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig

    和可执行文件 : sqlite3

    我们再假设你的sqlite3的安装目录在 /usr/local/sqlite3 目录下。

    如果不是,我们可以这样做,将你的安装文件复制到 /usr/local/sqlite3 这个目录,

    这样我们好在下面的操作中更加统一,从而减少出错的概率

    例如:[root@localhost home]# cp -rf sqlite-3.3.8-ix86/ /usr/local/sqlite3

    这里假设 /usr/local/sqlite3/ 是你的安装目录,也就是说你的sqlite原来就是安装在这里

    这样之后,我们的sqlite3的库文件目录是:/usr/local/sqlite3/lib

    可执行文件 sqlite3 的目录是: /usr/local/sqlite3/bin

    头文件 sqlite3.h 的目录是: /usr/local/sqlite3/include

    可以用ls命令查看下:

    [root@localhost sqlite]# ls /usr/local/sqlite3/lib

    libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig

    二、使用QT3连接SQLite

    [root@localhost zieckey]# mkdir test-qt3-sqlite3

    [root@localhost zieckey]# cd test-qt3-sqlite3/

    打开Designer

    [root@localhost test-qt3-sqlite3]# designer&

    [4] 8357

    新建一个C++ Project

    新建一个 Dialog

    在该dialog上放置一个 PushButton 和一个 LineEdit

    并设置相应的属性

    保存到 test-qt3-sqlite3 目录下

    新建一个 C++ Main-file (main.cpp )

    再保存

    然后生成 *.h,*.cpp文件

    [root@localhost test-qt3-sqlite3]# uic -o mainform.h mainform.ui

    [root@localhost test-qt3-sqlite3]# uic -i mainform.h -o mainform.cpp mainform.ui

    注:这里的 mainform.ui 是你的 Dialog 的保存文件名字。

    修改 *.pro文件,如下:

    SOURCES += main.cpp mainform.cpp

    HEADERS += mainform.h

    unix {

    UI_DIR = .ui

    MOC_DIR = .moc

    OBJECTS_DIR = .obj

    }

    TEMPLATE =app

    CONFIG += qt warn_on release

    LANGUAGE = C++

    SQLITE_PATH=/usr/local/sqlite3

    DEPENDPATH  += $$SQLITE_PATH/include

    INCLUDEPATH += $$SQLITE_PATH/include

    LIBS += -L$$SQLITE_PATH/lib

    LIBS +=  -lsqlite3

    TARGET  = test-sqlite.out

    编辑 mainform.h

    /****************************************************************************

    ** Form interface generated from reading ui file 'mainform.ui'

    **

    ** Created: 日 11月 5 16:24:45 2006

    **      by: The User Interface Compiler ($Id: qt/main.cpp   3.1.1   edited Nov 21 17:40 $)

    **

    ** WARNING! All changes made in this file will be lost!

    ****************************************************************************/

    #ifndef MAINFORM_H

    #define MAINFORM_H

    #include

    #include

    #include "sqlite3.h"            //注意,这里一定要添加进来

    class QVBoxLayout;

    class QHBoxLayout;

    class QGridLayout;

    class QLineEdit;

    class QPushButton;

    class MainForm : public QDialog

    {

    Q_OBJECT

    public:

    MainForm( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );

    ~MainForm();

    QLineEdit* showMsgLineEdit;

    QPushButton* openButton;

    public slots:

    virtual void openDBSlot();         //注意,这里是新建的一个SLOT

    protected:

    protected slots:

    virtual void languageChange();

    };

    #endif // MAINFORM_H

    编辑 mainform.cpp

    /****************************************************************************

    ** Form implementation generated from reading ui file 'mainform.ui'

    **

    ** Created: 日 11月 5 16:25:05 2006

    **      by: The User Interface Compiler ($Id: qt/main.cpp   3.1.1   edited Nov 21 17:40 $)

    **

    ** WARNING! All changes made in this file will be lost!

    ****************************************************************************/

    #include "mainform.h"

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    /*

    *  Constructs a MainForm as a child of 'parent', with the

    *  name 'name' and widget flags set to 'f'.

    *

    *  The dialog will by default be modeless, unless you set 'modal' to

    *  TRUE to construct a modal dialog.

    */

    MainForm::MainForm( QWidget* parent, const char* name, bool modal, WFlags fl )

    : QDialog( parent, name, modal, fl )

    {

    if ( !name )

    setName( "MainForm" );

    showMsgLineEdit = new QLineEdit( this, "showMsgLineEdit" );

    showMsgLineEdit->setGeometry( QRect( 150, 230, 350, 21 ) );

    openButton = new QPushButton( this, "openButton" );

    openButton->setGeometry( QRect( 150, 70, 91, 30 ) );

    languageChange();

    resize( QSize(600, 480).expandedTo(minimumSizeHint()) );

    // signals and slots connections

    connect( openButton, SIGNAL( clicked() ), this, SLOT( openDBSlot() ) );

    }

    /*

    *  Destroys the object and frees any allocated resources

    */

    MainForm::~MainForm()

    {

    // no need to delete child widgets, Qt does it all for us

    }

    /*

    *  Sets the strings of the subwidgets using the current

    *  language.

    */

    void MainForm::languageChange()

    {

    setCaption( tr( "A test Showing how to connect SQLite3 in QT3" ) );

    openButton->setText( tr( "Open DB" ) );

    }

    void MainForm::openDBSlot()

    {

    //qWarning( "MainForm::openDBSlot(): Not implemented yet" );

    //这里是数据库的访问

    sqlite3 *db=NULL;

    int rc;

    rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

    if( rc )

    {

    QString errMsgQString;

    errMsgQString.sprintf("Can't open database: %s\n", sqlite3_errmsg(db) );

    showMsgLineEdit->setText(errMsgQString);

    sqlite3_close(db);

    }

    else

    showMsgLineEdit->setText( "open zieckey.db successfully!\n" );

    sqlite3_close(db); //关闭数据库

    }

    main.cpp如下,它不用做任何更改,如果我们是按照上面说的那样生成main.cpp的话

    #include

    #include "mainform.h"

    int main( int argc, char ** argv )

    {

    QApplication a( argc, argv );

    MainForm w;

    w.show();

    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );

    return a.exec();

    }

    这一切做好了后,我们就可以开始编译了.

    这里说明一下,在这之后,我们关心的只有四个文件:

    main.cpp  mainform.h   mainform.cpp   *.pro

    [root@localhost test-qt3-sqlite3]# qmake

    [root@localhost test-qt3-sqlite3]# make

    中间也许会有很多警告信息,这个不是太大问题,如果没有错误,那么我们可以运行了:

    [root@localhost test-qt3-sqlite3]# ./test-sqlite.out

    也许会出现下面这样的错误:

    [root@localhost test-qt3-sqlite3]# ./test-sqlite.out

    ./test-sqlite.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object

    file: No such file or directory

    这个好办:

    [root@localhost qt3-sqlite3]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/sqlite3/lib

    [root@localhost qt3-sqlite3]# ./test-sqlite.out

    这样就好了。

    看到运行的效果了没?

    点击一下界面上的按钮,看看有什么反应?

    应该是这样的:

    那个标签条上显示:   open zieckey.db successfully!

    说明:实际应用的时候,在qt3下根本就不需要显示的调用 uic 生成 .h .cpp 文件,

    这里是方便行文才这样做的。

    总结:这里我们知道了QT Designer 的基本用法、QT编程的基本实现;

    最重要的是我们知道了怎么在qt下连接sqlite。本文纯粹是交流之作,仅作抛砖引玉之用。

    欢迎交流。

    更多相关内容
  • 前言SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成其他软件,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。用法1 准备引入SQL模块在Qt项目文件(.pro文件),加入SQL...

    前言

    SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。

    Qt5以上版本可以直接使用SQLite(Qt自带驱动)。

    用法

    1 准备

    引入SQL模块

    在Qt项目文件(.pro文件)中,加入SQL模块:

    QT += sql

    引用头文件

    在需要使用SQL的类定义中,引用相关头文件。例如:

    #include

    #include

    #include

    2 使用

    1. 建立数据库

    检查连接、添加数据库驱动、设置数据库名称、数据库登录用户名、密码。

    QSqlDatabase database;

    if (QSqlDatabase::contains("qt_sql_default_connection"))

    {

    database = QSqlDatabase::database("qt_sql_default_connection");

    }

    else

    {

    database = QSqlDatabase::addDatabase("QSQLITE");

    database.setDatabaseName("MyDataBase.db");

    database.setUserName("XingYeZhiXia");

    database.setPassword("123456");

    }

    上述代码解释:

    (1)第一行中,建立了一个QSqlDatabase对象,后续的操作要使用这个对象。

    (2)if语句用来检查指定的连接(connection)是否存在。这里指定的连接名称(connection name)是qt_sql_default_connection,这是Qt默认连接名称。实际使用时,这个名称可以任意取。如果判断此连接已经存在,那么QSqlDatabase::contains()函数返回true。此时,进入第一个分支,QSqlDatabase::database()返回这个连接。

    (3)如果这个连接不存在,则进入else分支,需要创建连接,并添加数据库。在else分支第一行,addDatabase()的参数QSQLITE是SQLite对应的驱动名,不能改。而且需要注意的是,addDatabase()的第二个参数被省略了,第二个参数的默认参数就是上面提到的Qt默认连接名称qt_sql_default_connection。如果需要使用自定义的连接名称(如果程序需要处理多个数据库文件的话就会这样),则应该加入第二个参数,例如

    database = QSqlDatabase::addDatabase("QSQLITE", "my_sql_connection);

    这个时候,如果在另一个地方需要判断my_sql_connection连接是否存在,就应该使用if (QSqlDatabase::contains("my_sql_connection"))。

    (4)else分支第二行中,setDatabaseName()的参数是数据库文件名。如果这个数据库不存在,则会在后续操作时自动创建;如果已经存在,则后续的操作会在已有的数据库上进行。

    (5)else分支后面两行,设置用户名和密码。用户名,密码都可以随便取,也可以省略。

    2. 打开数据库

    使用open()打开数据库,并判断是否成功。注意,在第一步检查连接是否存在时,如果连接存在,则在返回这个连接的时候,会默认将数据库打开。

    if (!database.open())

    {

    qDebug() << "Error: Failed to connect database." << database.lastError();

    }

    else

    {

    // do something

    }

    如果打开成功,则进入else分支。对数据库的操作都需要在else分支中进行。

    3. 关闭数据库

    数据库操作完成后,最好关闭。

    database.close();

    4. 操作数据库

    对数据库进行操作需要用到QSqlQuery类,操作前必须定义一个对象。下面举例说明操作方法。操作需要使用SQLite语句,本文中的几个例子会使用几个常用的语句,关于SQLite语句的具体信息请参考SQLite相关资料。

    例1:创建表格

    创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。

    QSqlQuery sql_query;

    QString create_sql = "create table student (id int primary key, name varchar(30), age int)";

    sql_query.prepare(create_sql);

    if(!sql_query.exec())

    {

    qDebug() << "Error: Fail to create table." << sql_query.lastError();

    }

    else

    {

    qDebug() << "Table created!";

    }

    代码解释:

    (1)第一行定义一个QSqlQuery对象。

    (2)第二行是一个QString,其中的内容是SQLite语句。对数据库的操作,都是用SQLite的语句完成的,把这些指令以QString类型,通过prepare函数,保存在QSqlQuery对象中。也可将指令,以QString形式直接写在exec()函数的参数中,例如:

    sql_query.exec("create table student (id int primary key, name varchar(30), age int)");

    创建表格语句:create table (f1 type1, f2 type2,…);

    create table是创建表格的语句,也可用大写CREATE TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。

    如果sql_query.exec()执行成功,则创建表格成功。

    例2:插入数据

    在刚才创建的表格中,插入一行数据。

    QString insert_sql = "insert into student values (?, ?, ?)";

    sql_query.prepare(insert_sql);

    sql_query.addBindValue(max_id+1);

    sql_query.addBindValue("Wang");

    sql_query.addBindValue(25);

    if(!sql_query.exec())

    {

    qDebug() << sql_query.lastError();

    }

    else

    {

    qDebug() << "inserted Wang!";

    }

    if(!sql_query.exec("INSERT INTO student VALUES(3,\"Li\", 23)"))

    {

    qDebug() << sql_query.lastError();

    }

    else

    {

    qDebug() << "inserted Li!";

    }

    插入语句:insert into values (value1, value2,…);

    insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。

    例3:更新数据(修改数据)

    QString update_sql = "update student set name = :name where id = :id";

    sql_query.prepare(update_sql);

    sql_query.bindValue(":name", "Qt");

    sql_query.bindValue(":id", 1);

    if(!sql_query.exec())

    {

    qDebug() << sql_query.lastError();

    }

    else

    {

    qDebug() << "updated!";

    }

    语句:update set , … where ;

    更新(修改)的语句是update...set...,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。

    bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

    例4:查询数据

    (1)查询部分数据

    QString select_sql = "select id, name from student";

    if(!sql_query.exec(select_sql))

    {

    qDebug()<

    }

    else

    {

    while(sql_query.next())

    {

    int id = sql_query.value(0).toInt();

    QString name = sql_query.value(1).toString();

    qDebug()<

    }

    }

    语句select , , ... from ;

    select是查询指令;

    QString select_all_sql = "select * from student";

    sql_query.prepare(select_all_sql);

    if(!sql_query.exec())

    {

    qDebug()<

    }

    else

    {

    while(sql_query.next())

    {

    int id = sql_query.value(0).toInt();

    QString name = sql_query.value(1).toString();

    int age = sql_query.value(2).toInt();

    qDebug()<

    }

    }

    语句select * from ;

    查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。

    (3)查询最大id

    QString select_max_sql = "select max(id) from student";

    int max_id = 0;

    sql_query.prepare(select_max_sql);

    if(!sql_query.exec())

    {

    qDebug() << sql_query.lastError();

    }

    else

    {

    while(sql_query.next())

    {

    max_id = sql_query.value(0).toInt();

    qDebug() << QString("max id:%1").arg(max_id);

    }

    }

    这个就是在语句中用max来获取最大值。

    例5:删除与清空

    (1)删除一条数据

    QString delete_sql = "delete from student where id = ?";

    sql_query.prepare(delete_sql);

    sql_query.addBindValue(0);

    if(!sql_query.exec())

    {

    qDebug()<

    }

    else

    {

    qDebug()<

    }

    语句delete from where =

    delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。

    (2)清空表格(删除所有)

    QString clear_sql = "delete from student";

    sql_query.prepare(clear_sql);

    if(!sql_query.exec())

    {

    qDebug() << sql_query.lastError();

    }

    else

    {

    qDebug() << "table cleared";

    }

    这里没有用where给出限制,就会删除所有内容。

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • } void SqliteQtDialog::createDB(void){//创建数据库 //建立和SQlite数据库连接 db = QSqlDatabase::addDatabase("QSQLITE"); //设置数据库文件的名称 db.setDatabaseName("menu.db"); //打开数据库 if(db.open() ...

    SqliteQtDialog.h

    #ifndef SQLITEQTDIALOG_H

    #define SQLITEQTDIALOG_H

    #include #include #include #include #include #include #include namespace Ui {

    class SqliteQtDialog;

    }

    class SqliteQtDialog : public QDialog

    {

    Q_OBJECT

    public:

    explicit SqliteQtDialog(QWidget *parent = 0);

    ~SqliteQtDialog();

    private slots:

    void on_insertButton_clicked();

    void on_deleteButton_clicked();

    void on_modifyButton_clicked();

    void on_sortButton_clicked();

    private:

    void createDB(void);//创建数据库

    void createTable(void);//创建学生成绩表

    void queryTable(void);//查询数据表

    private:

    Ui::SqliteQtDialog *ui;

    QSqlDatabase db;//建立和qt和数据库连接

    QSqlQueryModel model;//保存和遍历select结果

    };

    #endif // SQLITEQTDIALOG_H

    SqliteQtDialog.cpp

    #include "SqliteQtDialog.h"

    #include "ui_SqliteQtDialog.h"

    SqliteQtDialog::SqliteQtDialog(QWidget *parent) :

    QDialog(parent),

    ui(new Ui::SqliteQtDialog)

    {

    ui->setupUi(this);

    createDB();

    createTable();

    //查询和显示

    queryTable();

    }

    SqliteQtDialog::~SqliteQtDialog()

    {

    delete ui;

    }

    void SqliteQtDialog::createDB(void){//创建数据库

    //建立和SQlite数据库连接

    db = QSqlDatabase::addDatabase("QSQLITE");

    //设置数据库文件的名称

    db.setDatabaseName("menu.db");

    //打开数据库

    if(db.open() == false){

    QMessageBox::critical(this,"DataError",

    db.lastError().text());

    }

    }

    void SqliteQtDialog::createTable(void){//创建表

    //构建创建表的SQL语句

    QString createSql =

    QString("CREATE TABLE Student(\

    id INT PRIMARY KEY NOT NULL,\

    name TEXT NOT NULL,\

    score REAL NOT NULL)");

    QSqlQuery query;

    query.exec(createSql);

    }

    void SqliteQtDialog::queryTable(void){//查询表

    QString str = QString("SELECT * FROM Student");

    model.setQuery(str);

    ui->tableView->setModel(&model);

    }

    void SqliteQtDialog::on_insertButton_clicked()

    {

    QSqlQuery query;

    //获取学号

    int id = ui->idEdit->text().toInt();

    //获取姓名

    QString name(ui->nameEdit->text());

    //获取成绩

    double score = ui->scoreEdit->text().toDouble();

    //构造sql语句

    QString insertSql = QString(

    "INSERT INTO Student VALUES(%1,'%2',%3);"

    ).arg(id).arg(name).arg(score);

    qDebug() << insertSql;

    //执行sql语句

    query.exec(insertSql);

    query.exec("commit");

    //查询和显示

    queryTable();

    }

    //删除,通过ID匹配

    void SqliteQtDialog::on_deleteButton_clicked()

    {

    int id = ui->idEdit->text().toInt();

    //构造删除sql语句

    QString deleteSql = QString(

    "DELETE FROM Student WHERE id=%1").arg(id);

    QSqlQuery query;

    query.exec(deleteSql);

    //查询和显示

    queryTable();

    }

    //修改成绩

    void SqliteQtDialog::on_modifyButton_clicked()

    {

    QSqlQuery query;

    int id = ui->idEdit->text().toInt();

    double score = ui->scoreEdit->text().toDouble();

    QString modifySql = QString(

    "UPDATE Student SET score=%1 WHERE id=%2").

    arg(score).arg(id);

    qDebug() << modifySql;

    query.exec(modifySql);

    //查询和显示

    queryTable();

    }

    //排序

    void SqliteQtDialog::on_sortButton_clicked()

    {

    //获取排序关键字

    QString value = ui->ValueComboBox->currentText();

    //获取排序条件

    QString condition;

    if(ui->CondComboBox->currentIndex()){

    condition = "DESC";

    }

    else{

    condition = "ASC";

    }

    QString sortSql = QString(

    "SELECT * FROM Student ORDER BY %1 %2").

    arg(value).arg(condition);

    model.setQuery(sortSql);

    ui->tableView->setModel(&model);

    }

    SqliteQtDialog.ui

    ee02caba5b077530b586f64a374ac132.png

    展开全文
  • 一、直接用命令安装(需要linux联网) sudo apt-get update sudo apt-get install sqlite3 二、直接编译源码 1、将源码拷贝到Ubuntu的非共享目录解压 源码下载: 链接:...

    (一)sqlite的安装

    一、直接用命令安装(需要linux联网)

    sudo apt-get update
    sudo apt-get install sqlite3

    二、直接编译源码

    1、将源码拷贝到Ubuntu的非共享目录解压
    源码下载:

    链接:https://pan.baidu.com/s/16ZWcXpFzMwW9nBq6dVWs9w
    提取码:5r9e

    解压命令:tar -xzvf sqlite-snapshot-201708031550.tar.gz
    在这里插入图片描述

    2、直接编译源码
    (1)配置

    cd sqlite-snapshot-201708031550
    ./configure --prefix=/home/gec/sqlite

    在这里插入图片描述
    (2)编译

    make

    (3)安装

    make install

    安装完成之后sqlite3的可执行文件就会出现在/home/gec/sqlite/bin目录中,如果要直接使用可以将该文件拷贝到 /usr/bin目录下。
    在这里插入图片描述在这里插入图片描述

    (二)sqlite的使用

    (1)新建一个数据库文件

    sqlite3 数据库文件路径 //打开/创建
    //比如:sqlite3 first.db
    //打开数据库进入命令行

    在这里插入图片描述

    (2)基本操作命令

    .exit/.quit ------ 退出数据库命令行
    .help ------ 帮助说明信息
    .tables ----查看当前数据库中所有的表

    (3)数据库访问的SQL语句

    基本语法:
    所有的SQL语句都以分号(;)结束,不区分大小写

    1)新建表格

    create table 表名(字段名1 字段类型1,字段名2 字段类型2,字段名3 字段类型3....);
    比如:
    //创建一个stutbl的表,表中有三个字段
    //分别是整数类型的学号id,字符串类型的name,整数类型的age
    create table stutbl(id int,name char[20],age int);
    //不存在则创建
    create table if not exists stutbl(id int,name char[20],age int);
    
    //如果希望表中的某个字段的内容不重复,可以用unique修饰该字段
    create table if not exists stutbl(id int unique,name char[20],age int);
    

    2)删除表格

    drop table 表名;

    3)往表格中插入数据

    insert into 表名 values(字段值1,字段值2,字段值3....);
    //字段值如果是字符串,必须用''(单引号)括起来
    比如:
        insert into stutbl values(1,'张飞',23);
        insert into stutbl values(2,'赵云',19);
        insert into stutbl values(3,'刘备',31);
    

    完成插入之后,stutbl的表格内容如下:
    在这里插入图片描述

    4)查询表中的数据

    //查询表中的所有数据
    select * from 表名;

    4)按条件查找:

    1.使用where指定查询条件
        select * from testtbl where class=6;//查找class值为6的条目
        select * from testtbl where score>=90 and score<=100;
    2.查询指定的字段    
        select id,name,score from testtbl;//只查询id,name和score
    3.使用where+like实现模糊查询
        select * from testtbl where name like '何%';//查找名字以何开头的条目 
    4.使用order by实现查询结果按某个字段的值升序/降序输出
        select * from testtbl order by score desc;//按分数降序输出    
       select * from testtbl order by grade asc;//按年级升序输出   
    

    5)删除表中的条目

    delete from 表名 where 条件;//删除所有符合条件的条目
    比如:
        delete from testtbl where id=1;
    

    6)更新(修改)表中的条目

    update 表名 set 字段名1=字段值1,字段名2=字段值2.... where 条件;//修改符合条件的条目
    比如:
        update testtbl set age=17,score=83.5 where id=4;
    

    (4)sqlite中数字段类型

    数字:
    int ---------- 整型
    smallint ----- 短整型
    tinyint ------ 微型整数(0~255)
    bit ---------- 0 or 1
    float ------ 单精度浮点型
    real ------- 双精度浮点型

    字符串:
    char ------ 非unicode定长字符串 < 8000
    varchar — 非unicode变长字符串 <8000
    text ------ 非unicode变长字符串 < 2^32-1
    nchar ------ unicode定长字符串 < 8000
    nvarchar — unicode变长字符串 < 8000
    ntext ------ unicode变长字符串 < 2^32-1

    5.sqlite的C语言访问接口
    sqlite本身自带C语言访问接口,在C语言环境下可以直接调用,使用这些接口的代码需要把 sqlite的源码编译进可执行程序 或者 编译时连接sqlite的库。
    (1)打开 --------- sqlite3_open

    int sqlite3_open(
      const char *filename,   /*数据库的文件路径*/
      sqlite3 **ppDb          /*输出参数:传出代表打开数据库的句柄*/
    );
    //成功返回SQLITE_OK,否则打开失败
    

    (2)关闭 --------- sqlite3_close

    int sqlite3_close(sqlite3 *pDb); //传入要关闭的数据库的句柄

    编译方法(必须链接pthread库和dl库):

    1.直接编译源码
        gcc sqlite3.c sqlite_test.c -pthread -ldl -o sqlite_test
    2.链接sqlite3的库
        gcc sqlite_test.c -pthread -ldl -lsqlite3 -L /home/gec/sqlite/lib -o sqlite_test1
        
    //如果运行时找不到sqlite3库,可以将编译出来的库文件拷贝到/usr/lib目录下(cp -r)    
    

    (三)如何在QT中使用sqlite

    1、直接将sqlite3的源码加入到Qt工程中,在Qt代码中直接调用sqlite的接口
    2、数据库查询结果显示到QT界面
    Qt中提供的显示表格的类 --------- QTableView
    QTableView在显示表格内容时,可以先把显示的内容写入到QStandardItemModel模型对象中,再将模型对象和表格对象绑定,绑定后模型的内容就会同步显示到表格中。
    在这里插入图片描述
    1)如何绑定表格和模型

    QTableView的成员函数:
    setModel(模型对象);

    2)如何设置模型的内容

    QStandardItemModel的成员函数:
    设置列头部标题 ----- setHorizontalHeaderItem(列, QStandardItem *item);
    设置单元格的内容 — setItem(行, 列, QStandardItem *item);
    删除指定的行 ------ removeRows(起始行号,行数);
    获取行数 ------- rowCount();

    3、QT的数据库模块
    Qt的开发环境集成了数据库访问的功能,也自带数据库sqlite,同时还提供了多种访问数据库的类,通过这些类可以实现对数据库的访问,使用Qt的数据库模块需要在工程文件中添加

    QT += sql

    (1)数据库驱动类 ------ QSqlDatabase
    1)addDatabase ------- 添加数据库驱动

    [static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, 
            const QString &connectionName = QLatin1String(defaultConnection));
    //需要传入添加数据库的类型,比如使用sqlite就传 "QSQLITE"
    //返回本类型对象
    

    2)setDatabaseName ------- 设置数据库文件路径

    void QSqlDatabase::setDatabaseName(const QString &name);
    //传入数据库文件路径,添加数据库驱动成功之后才调用该函数
    

    3)open ------- 打开数据库

    bool QSqlDatabase::open();
    //设置数据库文件路径后才能打开,返回成功/失败 
    

    (2)执行SQL语句的类 -------- QSqlQuery
    该类用于执行sql语句,可以直接使用sql语句构造,此时sql语句会自动执行一次。在构建QSqlQuery对象时必须保证数据库已经打开。
    成员函数:
    1)exec ------- 执行sql语句

    bool QSqlQuery::exec(const QString &query);
    //传入要执行的sql语句(不需要加分号),不传参数就执行构造时的sql语句
    //返回执行成功/失败
    

    2)lastError ------ 获取错误原因

    QSqlError QSqlQuery::lastError() const;
    

    3)next ------- 获取sql语句执行的结果(查询)

    bool QSqlQuery::next();
    //每调用一次返回一条结果,返回的结果在对象的value数组中,通过value成员函数获取
    //数据全部取完返回false,否则返回true
    
    QVariant QSqlQuery::value(int index) const;//通过编号获取字段值
    QVariant QSqlQuery::value(const QString &name) const;//通过字段名获取字段值
    

    最后附上一个例子实现建表、插入、查询、删除、修改、显示的操作。
    stu.h

    #ifndef STU_H
    #define STU_H
    
    #include <QWidget>
    #include "sqlite3.h"
    #include <QStandardItemModel>
    namespace Ui {
    class stu;
    }
    
    class stu : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit stu(QWidget *parent = NULL);
        ~stu();
        //模型
        QStandardItemModel *model;
        //记录第几行
        quint16 count;
    
    private slots:
        void on_pushButton_CreateTable_clicked();
    
        void on_pushButton_Insert_clicked();
    
        void on_lineEdit_InsertName_textEdited(const QString &arg1);
    
        void on_pushButton_Search_clicked();
    
        void on_pushButton_Delete_clicked();
    
        void on_pushButton_Update_clicked();
    
    private:
        Ui::stu *ui;
        //数据库句柄
        sqlite3 *pDb;
    
    };
    
    #endif // STU_H
    
    

    stu.cpp

    #include "stu.h"
    #include "ui_stu.h"
    #include <QMessageBox>
    #include <QDebug>
    
    stu::stu(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::stu)
    {
        ui->setupUi(this);
    
        //初始化模型
        model = new QStandardItemModel(this);
        model->setHorizontalHeaderItem(0, new QStandardItem("id"));
        model->setHorizontalHeaderItem(1, new QStandardItem("name"));
        model->setHorizontalHeaderItem(2, new QStandardItem("age"));
    
        //绑定模型和表格
        ui->tableView->setModel(model);
        //打开数据库
        int res = sqlite3_open("stu.db", &pDb);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "打开数据库失败!");
        }
    }
    
    stu::~stu()
    {
        delete ui;
        //关闭数据库
        sqlite3_close(pDb);
    }
    
    //建表
    void stu::on_pushButton_CreateTable_clicked()
    {
        QString sql = QString("create table if not exists %1(id int unique, name nvarchar, age int);")
                .arg(ui->lineEdit_TableName->text());
        //执行sql
        int res = sqlite3_exec(pDb, sql.toStdString().c_str(), NULL, NULL, NULL);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "建表失败!");
            return;
        }
    
        //表名输入框和按钮禁止
        ui->lineEdit_TableName->setEnabled(false);
        ui->pushButton_CreateTable->setEnabled(false);
    
    }
    
    //插入
    void stu::on_pushButton_Insert_clicked()
    {
        QString sql = QString("insert into %1 values(%2,'%3',%4);")
                .arg(ui->lineEdit_TableName->text())
                .arg(ui->spinBox_Insertid->value())
                .arg(ui->lineEdit_InsertName->text())
                .arg(ui->spinBox_Insertage->value());
        //执行sql
        int res = sqlite3_exec(pDb, sql.toStdString().c_str(), NULL, NULL, NULL);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "插入失败!");
        }
        //更新显示
        on_pushButton_Search_clicked();
    }
    
    void stu::on_lineEdit_InsertName_textEdited(const QString &arg1)
    {
        if(arg1.isEmpty())
        {
            ui->pushButton_Insert->setEnabled(false);
        }
        else {
            ui->pushButton_Insert->setEnabled(true);
        }
    }
    
    //查询回调函数
    static int sql_callback(void *arg, int col, char **str, char **name)
    {
        //恢复对象的类型
        stu *db = static_cast<stu *>(arg);
        for(int i=0;i<col;i++)
        {
            //将查询结果显示到模型中
            db->model->setItem(db->count, i, new QStandardItem(str[i]));
        }
        db->count++;
        return SQLITE_OK;
    }
    
    //查询
    void stu::on_pushButton_Search_clicked()
    {
        QString sql = QString("select *from %1").arg(ui->lineEdit_TableName->text());
        count=0;
        //执行sql----把本对象传给回调函数
        int res = sqlite3_exec(pDb, sql.toStdString().c_str(), sql_callback, this, NULL);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "查询失败!");
        }
    }
    
    //删除
    void stu::on_pushButton_Delete_clicked()
    {
        QString sql = QString("delete from %1 where id=%2;")
                .arg(ui->lineEdit_TableName->text())
                .arg(ui->spinBox_Deleteid->value());
        //执行sql
        int res = sqlite3_exec(pDb, sql.toStdString().c_str(), NULL, NULL, NULL);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "删除失败!");
            return;
        }
        QMessageBox::warning(this,"提示", "删除成功!");
        //删除之前的内容
        model->removeRows(0,model->rowCount());
        //更新显示
        on_pushButton_Search_clicked();
    }
    
    //修改
    void stu::on_pushButton_Update_clicked()
    {
        QString sql;
        if(ui->radioButton_newid->isChecked())
        {
            sql = QString("update %1 set id=%2 where id=%3;")
                    .arg(ui->lineEdit_TableName->text())
                    .arg(ui->spinBox_newid->value())
                    .arg(ui->spinBox_Updateid->value());
        }
        else if(ui->radioButton_newname->isChecked())
        {
            sql = QString("update %1 set name='%2' where id=%3;")
                    .arg(ui->lineEdit_TableName->text())
                    .arg(ui->lineEdit_newname->text())
                    .arg(ui->spinBox_Updateid->value());
        }
        else if(ui->radioButton_newage->isChecked())
        {
            sql = QString("update %1 set age=%2 where id=%3;")
                    .arg(ui->lineEdit_TableName->text())
                    .arg(ui->spinBox_newage->value())
                    .arg(ui->spinBox_Updateid->value());
        }
        //执行sql
        int res = sqlite3_exec(pDb, sql.toStdString().c_str(), NULL, NULL, NULL);
        if(res != SQLITE_OK)
        {
            QMessageBox::warning(this,"提示", "更新失败!");
            return;
        }
        QMessageBox::warning(this,"提示", "更新成功!");
        //更新显示
        on_pushButton_Search_clicked();
    }
    
    

    结果显示:
    在这里插入图片描述

    展开全文
  • 这是在linux下做的一个订餐管理系统,数据库使用的是sqlite,基本的功能都实现了,管理权限有总经理,系统管理员,前台管理员,客户,仓库管理员,菜单管理员,基本的订餐,菜单管理,仓库管理的功能都实现了
  • 嵌入式Linux基于Qt开发SQLite应用

    千次阅读 2018-03-06 16:19:50
    ByToradex秦海1)....基于上述特性,SQLite非常适合于嵌入式系统实现一个轻量级的数据库管理,本文就展示基于嵌入式LinuxQt GUI开发一个SQLite演示例程。 本文所演示的平台来自于Toradex Col...
  • QT 使用SQLite3

    2016-06-09 15:27:04
    Qt 调用SQLITE3数据路,亲测有效
  • #include #include #include #include #define SQLITE_DATABASE "/QT.db"int main(int argc, char* argv[]){QApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseNam...
  • 没有参数的QSqlQuery构造函数为您的应用程序使用默认数据库。 可能尚未设置。 使用构造函数指定查询要使用的数据库:QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connection_name");...
  • sqlite3编译安装------------------------arm版----------------------1....开始配置,执行命令如下(前提配置好交叉编译环境):./configure --prefix=/usr/local/sqlite_arm --host=arm-linux4.开...
  • 我用Sqlite3和Qt5.10.1写的学生管理系统,其中有学生和管理员两个角色。学生功能较为简单,仅可以查询自己的一些信息。管理员针对学生有增删改的权限,以及根据成绩去排序。 数据库设计较为简单,只有一张数据库表,...
  • Qt下使用SQLite3

    热门讨论 2012-06-21 09:47:49
    编译环境:QT4.5+qt-creator2.4+arm-linux-gcc 4.3.3 程序是通过在QT槽函数调用SQLite3的API来实现对数据库的数据操作,这里我们默认嵌入式Linux中已经移植类SQLite3,程序中将调用SQLite3的库文件。
  • 讲解了在Linux中操作sqlite3的方法;Windows和Linux中sqlite3数据与C/C++的接口编程,包括打开数据库文件、操作数据、关闭数据库文件、数据绑定机制和事务机制;以及Windows和Linux中sqlite3库的制作与使用。...
  • qt4如果要支持sqlite3数据库,则必须修改qmke -project和qmake之后生成的Makefile文件的INCPATH和LIBS目录:  INCPATH问Qt支持的头文件路径,LIBS为Qt支持的库文件的路径,针对sqlite3分别为sqlite3.h和...
  • linux下搭建sqlite环境,以及在Qt上访问数据库的类,测试数据库的操作。
  • C++,QTsqlite数据库,EXCEL
  • qt中使用sqlite3

    2022-03-09 17:45:02
    qt中使用sqlite3
  • SQLite3+Qt开发】SQLite3简要介绍+在Qt5的使用步骤

    千次阅读 多人点赞 2022-04-02 00:29:58
    SQLite3简要介绍+在Qt5使用步骤
  • SQLite_Viewer 使用Qt制作的简单SQLite数据库查看器 使用此应用程序,您可以创建数据库,打开数据库,对其进行一些更改,然后将其保存为.db扩展名的文件。
  • sqlite3编译安装------------------------arm版----------------------1....开始配置,执行命令如下(前提配置好交叉编译环境):./configure --prefix=/usr/local/sqlite_arm --host=arm-linux4.开...
  • 今天分享一个Qt下,使用SQLite的一个案例。QT中SQLite使用【实例】#include //#include #include #include #include #include #include #include #include int main(int argc, char *argv[]){QCoreApplication a...
  • 先看效果图:该程序对数据库的操作包括4个字段:ID、Name、Addr、Nick (注意第一个字段必须是整数)query、insert、delete按钮分别表示查询、插入、删除功能查询按钮的实现:void database::on_QueryButton_clicked...
  • Linux 下Qt4 与SQLite3 组合编程5 部曲之三所有教程和代码;/share/link?shareid=622391&uk=270 1628[所有可执行程序均ubuntu 10.04 LTS AMD6 系统进行编译的,请注意你的操作系统和CPU 位数,否则软件运行...
  • SQLite3是一款轻量级的文件型数据库,非常适合嵌入式环境使用,最近搞的Linux嵌入式项目需要用到这款数据库,就研究了一下怎么嵌入式Linux中使用,记录下来以备查用。 我的嵌入式核心板MPU用的是TI的AM3352这...
  • linux下安装sqlite3

    千次阅读 2021-03-13 10:47:08
    linux如何安装sqlite3 1、下载sqlite3开源安装包 ...提取码:g9yo ...4、进入解压缩完的文件夹,执行配置命令,生成编译文件 ./configure --prefix=指定的文件夹名称(我这里home目录新建了一个sqli
  • 根据视频制作的一个Qt学生成绩管理系统,在linux环境运用了sqlite3数据库实现的这个,目前没有测试windows平台的
  • QT自带的Sqlite引擎是不支持加密的,所以自己实现了能够加密的Sqlite引擎,继承QSqlDriver实现的,与其他数据库一样使用QSqlDatabase进行操作,与QT自带数据库操作保持一致。文件包含项目源码及测试代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,911
精华内容 3,164
关键字:

在linux下qt中sqlite