Qt之操作数据库(SQLite)

SQLite

简介

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有12个年头,SQLite也迎来了一个版本SQLite3已经发布。

SQLite的功能

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:

  ATTACH DATABASE

  BEGIN TRANSACTION

  comment

  COMMIT TRANSACTION

  COPY

  CREATE INDEX

  CREATE TABLE

  CREATE TRIGGER

  CREATE VIEW

  DELETE

  DETACH DATABASE

  DROP INDEX

  DROP TABLE

  DROP TRIGGER

  DROP VIEW

  END TRANSACTION

  EXPLAIN

  expression

  INSERT

  ON CONFLICT clause

  PRAGMA

  REPLACE

  ROLLBACK TRANSACTION

  SELECT

  UPDATE

同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点像,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是3.7.8。它的官方网站是:http://www.sqlite.org或者http://www.sqlite .com .cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士。

SQLite的特性

下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.

  1. ACID事务

  2. 零配置 – 无需安装和管理配置

  3. 储存在单一磁盘文件中的一个完整的数据库

  4. 数据库文件可以在不同字节顺序的机器间自由的共享

  5. 支持数据库大小至2TB

  6. 足够小,大致3万行C代码,250K

  7. 比一些流行的数据库在大部分普通数据库操作要快

  8. 简单,轻松的API

  9. 包含TCL绑定,同时通过Wrapper支持其他语言的绑定

  10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

  11. 独立: 没有额外依赖

  12. Source完全的Open,你可以用于任何用途,包括出售它

13. 支持多种开发语言,C、PHP、Perl、Java、C#、Python

SQLite类型

SQLite的数据类型

  首先你会接触到一个让你惊讶的名词:Typelessness(无类型).对! SQLite是无类型的.这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释).对于SQLite来说对字段不指定类型是完全有效的. 如:

  Create Table ex1(a, b, c);

  诚然SQLite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型.因为数据类型对于你和其他的程序员交流,或者你准备换掉你的数据库引擎时能起到一个提示或帮助的作用.SQLite支持常见的数据类型,如:

  CREATE TABLE ex2(

  a VARCHAR(10),

  b NVARCHAR(15),

  c TEXT,

  d INTEGER,

  e FLOAT,

  f BOOLEAN,

  g CLOB,

  h BLOB,

  i TIMESTAMP,

  j NUMERIC(10,5)

  k VARYING CHARACTER (24),

  l NATIONAL VARYING CHARACTER(16)

  );

前面提到在某种情况下,SQLite的字段并不是无类型的.即在字段类型为”Integer Primary Key”时.

如何连接SQLite?

用PHP操作sqlite数据库

  a、 如何连接sqlite数据库?

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  select * from sqlite_master;

  echo "数据库连接成功!n

  ";

  } else {

  die($sqliteerror);

  }

  b、 如何列出数据库中所有的表?

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  $result = sqlite_array_query($db, 'select * from sqlite_master;');

  foreach ($result as $entry) {

  echo 'talbe name='.$entry['name']."

  n";

  echo 'sql='.$entry['sql']."

  n";

  echo "

  --------------------------------------------------------------------------------

  ";

  }

  sqlite_close($db);

  } else {

  die($sqliteerror);

  }}

  c、 对sqlite数据库的查询,以及结果集的显示

  if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {

  $result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);

  echo "user表查询结果:

  n";

  echo " n name email

  n";

  foreach ($result as $entry) {

  echo ' '.$entry['name']." " $entry['email']."

  n";

  }

  echo ' ';

  sqlite_close($db);

  } else {

  die($sqliteerror);

  }

  d、 数据库对象记录的增加、删除、修改

  sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");

  sqlite_query($db, "delete from user where user=’user99’");

sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');

用JAVA操作SQLite

开发所需依赖

  先下载SQLite数据库的驱动包

  将下载到的包解压后得到jar包sqlitejdbc-v033-nested.jar放到%JAVA_HOME%\lib 下,并且将其添加到classpath系统环境变量中,我的classpath系统环境变量现在为:

  .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar

  在你的代码中引用这个驱动:

  Class.forName("org.sqlite.JDBC");

  Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");//filename为你的SQLite数据名称

  // ... use the database ...

conn.close();

或者在编写代码的时候进行外部jar包的导入。步骤:右击工程->Build Path->Config Build Path->Libraries->Add External Jars选择你要导入的SQLite的jar包

示例代码

package wang.liang;

import java.sql.*;

 

public class TestSQLite {

       public static void main(String[] args) {

              try {

                     Class.forName("org.sqlite.JDBC");//连接SQLite的JDBC

                     //建立一个数据库名testSQLite.db的连接,如果不存在就目录下创建之

                     Connection conn =DriverManager.getConnection("jdbc:sqlite://E:/Program code/SQLite code/testSQLite.db");

                     Statement stat = conn.createStatement();

//创建一个表,两列

                     stat.executeUpdate("create table table1(name varchar(20), salary int);");

//插入数据

                     stat.executeUpdate("insert into table1 values('ZhangSan',6000);");                             stat.executeUpdate("insert into table1 values('LiSi',7800);");

                     stat.executeUpdate("insert into table1 values('WangWu',8800);");

                     stat.executeUpdate("insert into table1 values('ZhaoLiu',9000);");

                     ResultSet rs = stat.executeQuery("select * from table1;");//查询数据

                     while(rs.next()){//将查询到的数据打印出来

                            System.out.print("name = "+ rs.getString("name")+" ");//列属性一

                            System.out.println("salary = "+ rs.getString("salary"));//列属性二

                     }

                     rs.close();

                     conn.close();//结束数据库的连接

              }

              catch(Exception e ) {

                     e.printStackTrace();

              }

       }

}

总结:本文介绍了嵌入式数据库SQLite在Java中的应用,通过创建表、插入数据、查询等操作介绍了在Java中对数据库的操纵。

用C、C++操作SQLite

核心对象和接口

SQL数据库引擎的最主要任务是解析SQL语句。为了达成这个目的,开发者需要了解两个对象:

* 数据库连接对象:sqlite3

* 预处理语句对象:sqlite3_stmt

严格来讲,预处理语句对象并不是必须的,因为能够使用sqlite_exec或者sqlite3_get_table这些便于使用的封装接口,而这些接口封装并隐藏了预处理语句对象。尽管如此,对预处理对象的理解有助于我们更充分的使用SQLite。

数据库连接对象和预处理对象是由下列的一组C/C++接口调用操纵的:

* sqlite3_open()

* sqlite3_prepare()

* sqlite3_step()

* sqlite3_column()

* sqlite3_finalize()

* sqlite3_close()

这6个C/C++接口例程和上述的两个对象构成了SQLite的核心功能。开发者对于它们的理解能够更好的使用SQLite。

注意,这个接口例程列表更多是概念上的意义而不是实际的接口。许多这些接口都出现在各个版本之中。例如,上述列表中的sqlite3_open()例程实际上有三个不同的接口以略微不同的方式实现相同的功能:slqite3_open(),sqlite3_open16()和sqlite3_open_v2()。列表中的实际上并不存在sqlite3_column()这个接口。显示在列表中的“sqlite3_column()”仅仅是一个占位,表示一整套用于从表中查询出各种数据类型的列记录接口。

这里说明下核心接口的主要功能:

sqlite3_open() 该接口打开与一个SQLite数据库文件的连接并返回一个数据库连接对象。这通常是应用程序调用的第一个SQLite API接口而且也是调用其他SQLite API接口前需要调用的接口。许多SQLite接口需要一个指向数据库连接对象的指针作为它们的第一个参数,因而这些接口也可以理解成是数据库连接对象的操作接口。该接口就是创建了这样一个数据库连接对象。

sqlite3_prepare() 该接口把一个SQL语句文本转换成一个预处理语句对象并返回一个指向该对象的指针。这个接口需要一个由先前调用sqlite3_open()返回的数据库连接对象指针以及一个预处理的SQL语句文本字符串为参数。这个API并不实际解析SQL语句,仅仅是为后续的解析而对SQL语句进行的预处理。

注意:新的应用中不建议使用sqlite3_prepare(),应该使用另一个接口sqlite3_prepare_v2()。

sqlite3_step() 该接口用于解析一个由先前通过sqlite3_prepare()接口创建的预处理语句,直至返回第一列结果为止。通过再次调用sqlite3_step()可以返回下一列的结果,继续不断地调用sqlite3_step()直至整个语句完成为止。对于那些并不返回结果的语句(例如:INSERT,UPDATE,DELETE语句)一次调用sqlite3_step()就完成了语句的处理。

sqlite3_column() 该接口返回一个由sqlite3_step()解析的预处理语句结果集中当前行某一列数据。每次执行sqlite3_step()都返回一个新结果集中的一行。可以多次调用sqlite3_column()接口返回那一行中所有列的数据。就像上面所说的那样,SQLite API中并没有sqlite3_column()这样的接口。取而代之的是一组用于从结果集中查询出各个列项各种数据类型数据的函数接口。在这组函数接口中,有些接口返回结果集的大小,有些返回结果集的列数。

*sqlite3_column_blob()

*sqlite3_column_bytes()

*sqlite3_column_bytes16()

*sqlite3_column_count()

*sqlite3_column_double()

*sqlite3_column_int()

*sqlite3_column_int64()

*sqlite3_column_text()

*sqlite3_column_text16()

*sqlite3_column_type()

*sqlite3_column_value()

sqlite3_finalize() 该接口销毁之前调用sqlite3_prepare()创建的预处理语句。每一个预处理语句都必须调用这个接口进行销毁以避免内存泄漏。

sqlite3_close() 该接口关闭一个由之前调用sqlite3_open()创建的数据库连接。所有与该连接相关的预处理语句都必须在关闭连接之前销毁。

开发所需依赖

下载地址:http://www.sqlite.org/download.html

在该页面上下载Source Code中的sqlite-amalgamation-3071300.zip,该包有含有两个头文件,两个实现文件。

下载Precompiled Binaries For Windows中的sqlite-dll-win32-x86-3071300.zip,该包中含有一个def文件,一个dll文件。

新建一个win32控制台应用程序sqlite,选择空项目。

方法一:将所得dll、sqlite3.h、sqlite3.lib文件拷贝到../工程/sqlite/下,点击头文件,选择添加现有项,选择拷贝的sqlite.h文件,选择工程->属性->链接器->输入->附加依赖项,填写sqlite3.lib,再在原文件中编写自己的主程序。

方法二:将sqlite3.h、sqlite3.c、sqlite3.lib文件拷贝../工程/sqlite/下,点击头文件,选择添加现有项,选择拷贝的sqlite3.h文件。点击源文件添加现有项,选择拷贝的sqlite3.c文件,选择工程->属性->链接器->输入->附加依赖项,填写sqlite3.lib,然后便携自己的主程序。

示例代码

示例代码一:

#include 

#include "sqlite3.h"

using namespace std;

 

int main( )

{

     sqlite3 *db=NULL; //定义SQLite的连接

     const char *zErrMsg = 0;//错误信息

     int rc;

     rc = sqlite3_open("E:/Program code/SQLite code/testSQLite.db", &db);

     if(rc != SQLITE_OK) //如果打开数据库失败

     {

         zErrMsg = sqlite3_errmsg(db); //获取错误信息

         cout<

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

         return -1;

     }

     cout<<"open testSQLite.db successfully!"<

     sqlite3_close(db);

     return 0;

}

示例代码二:

头文件:my_db.h、sqlite3.h

源文件:sqlitedb.cpp、main.cpp

My_db.h代码:

#ifndef MY_DB_H

#define MY_DB_H

 

int open_db();

int create_table();

int drop_table();

int insert_data(int id,char *name,int age);

int search_data(int id);

int search_data(char *name);

int delete_data(int age);

 

#endif

Sqlitedb.cpp代码:

#include "sqlite3.h"

#include "my_db.h"

#include 

using namespace std;

 

sqlite3 *db = NULL; //定义数据库连接

const char *errMsg = 0; //定义错误信息

char *zerrMsg = 0; //定义错误信息

 

//打开数据库

int open_db()

{

     int rc = sqlite3_open("E:/Program code/SQLite code/sqlitejdbc.db",&db); //打开数据库

     if(rc != SQLITE_OK)    //数据库打开失败

     {

         errMsg = sqlite3_errmsg(db); //获取错误信息

         cout<

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

         return -1;

     }

     cout<<"open database successfully!"<

     return 0;

}

 

//创建表

int create_table()

{

     if(open_db() != 0)

     {

         open_db();

     }

     char *sql = "create table tab(id int primary key ,name varchar(20) ,age int)";

 

     

     int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         sqlite3_close(db);

         return -1;

     }

     cout<<"创建表成功!"<

     return 0;

}

 

//删除表

int drop_table()

{

     if(open_db() != 0)

     {

         open_db();

     }

     char *sql = "drop table tab";

     int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         sqlite3_close(db);

         return -1;

     }

     cout<<"删除表成功"<

     return 0;

}

 

//数据添加

int insert_data(int id,char *name,int age)

{

     if(open_db() != 0)

     {

         open_db();

     }

     sqlite3_stmt *stmt = NULL; //准备语句对象

     char *sql = "insert into tab(id,name,age) values(?,?,?)";

     

     int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         if(stmt)

         {

              sqlite3_finalize(stmt);

         }

         sqlite3_close(db);

         return -1;

     }

     sqlite3_bind_int(stmt,1,id);

     //参数一:准备语句对象参数二:序号(从开始)参数三:字符串值参数四:字符串长度参数五:函数指针,SQLITE3执行完操作后回调此函数,通常用于释放字符串占用的内存。(这个函数指针参数具体怎么使用,我现在还不清楚

     sqlite3_bind_text(stmt,2,name,strlen(name),NULL);

     sqlite3_bind_int(stmt,3,age);

     

     if(sqlite3_step(stmt) != SQLITE_DONE)

     {

         sqlite3_finalize(stmt);

         sqlite3_close(db);

         return -1;

     }

     cout<<"数据插入成功!"<

     sqlite3_reset(stmt);

     sqlite3_finalize(stmt);

     sqlite3_close(db);

     return 0;

}

 

//数据查询根据id唯一性查询

int search_data(int id)

{

     if(open_db() != 0)

     {

         open_db();

     }

     char *sql = "select * from tab where id = ?";

     sqlite3_stmt  *stmt = NULL;

     int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         if(stmt)

         {

              sqlite3_finalize(stmt);

         }

         sqlite3_close(db);

         return -1;

     }

     sqlite3_bind_int(stmt,1,id);

     int nColumn = sqlite3_column_count(stmt); //获取数据库表的列数

     int type; //表字段所对应的类型

     rc = sqlite3_step(stmt);

     if(rc == SQLITE_ROW)

     {

         for(int i=0;i

         {

              type = sqlite3_column_type(stmt,i);

              if(type == SQLITE_INTEGER)

              {

                   cout<

              }

              if(type == SQLITE_TEXT)

              {

                   cout<

              }

              else if(type == SQLITE_NULL)

              {

                   cout<<"no value"<

              }

 

         }

     }

     else if(rc == SQLITE_DONE)

     {

         cout<<"select finish!"<

     }

     else

     {

         cout<<"select fail"<

         sqlite3_finalize(stmt);

     }

     sqlite3_finalize(stmt);

     sqlite3_close(db);

     return 0;

}

 

 

//数据查询根据姓名批量查询

int search_data(char *name)

{

     if(open_db() != 0)

     {

         open_db();

     }

     char *sql = "select * from tab where name = ?";

     sqlite3_stmt  *stmt = NULL;

     int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         if(stmt)

         {

              sqlite3_finalize(stmt);

         }

         sqlite3_close(db);

         return -1;

     }

     sqlite3_bind_text(stmt,1,name,strlen(name),NULL);

     int nColumn = sqlite3_column_count(stmt);

     int type;

     rc = sqlite3_step(stmt);//如果是select语句,且有还有记录,则应该返回SQLITE_ROW

     while(true) {

         if(rc == SQLITE_ROW)

         {   

              cout<<"--------------"<

              for(int i=0;i

              {

                   type = sqlite3_column_type(stmt,i);

                   if(type == SQLITE_INTEGER)

                   {

                       cout<

                   }

                   if(type == SQLITE_TEXT)

                   {

                       cout<

                   }

                   else if(type == SQLITE_NULL)

                   {

                       cout<<"no value"<

                   }

 

              }

         }

         else if(rc == SQLITE_DONE)

         {

              cout<<"select finish!"<

         }

         else

         {

              cout<<"select fail"<

              sqlite3_finalize(stmt);

         }

 

         if (sqlite3_step(stmt) != SQLITE_ROW)

              break;

     }

 

     sqlite3_finalize(stmt);

     sqlite3_close(db);

     return 0;

}

 

//删除数据

int delete_data(int age)

{

     if(open_db() != 0)

     {

         open_db();

     }

     char *sql = "delete from tab where age = ?";

     sqlite3_stmt  *stmt = NULL;

     int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);

     if(rc != SQLITE_OK)

     {

         errMsg = sqlite3_errmsg(db);

         cout<

         if(stmt)

         {

              sqlite3_finalize(stmt);

         }

         sqlite3_close(db);

         return -1;

     }

     sqlite3_bind_int(stmt,1,age);   

     rc  = sqlite3_step(stmt);//如果是update, delete, insert等语句,正常应该返回SQLITE_DONE

     if(rc == SQLITE_DONE)//SQLITE_DONE意味着已成功完成执行该语句

     {

         cout<<"删除数据成功"<

     }   

     sqlite3_finalize(stmt);

     sqlite3_close(db);

     return 0;

}

main.cpp代码:

#include "my_db.h"

#include 

using namespace std;

int main()

{

     //open_db();

     //create_table();

     //drop_table();

     //insert_data(3,"wang",25);

     //search_data(1);

     //search_data("wang");

     //delete_data(28);

     return 0;

}

SQLite加密解密

对数据库而言,加密无非是必不可少了一个环节,如何才能让自己更安全更放心的使用SQLite呢?加密!但是在这里还是很不好意思的说,如果是面向公众开放的开源性SQLite,他是不能实现加密的,当然,除非你付款。此前我也很想研究下加密部分,当看到资料上存在可以加密、解密的方法时,很兴奋的试了试,结果却很让人很纠结。

进入sqlite3.h头文件当中,搜索sqlite3_key(sqlite3 *db,const void *pKey,int nKey)加密方法、sqlite3_rekey(sqlite3 *db,const void *pKey,int nKey)解密方法时,可以看到主要的注释——The code to implement this API is not available in the public release of SQLite.

虽然加密解密方法对于开源用户来说不能使用,但是我们毕竟也了解到SQLite本身是提供加密、解密方法的。所以先了解一下加密、解密方法的使用吧。

加密:

给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,

该函数有三个参数,其中参数一:数据库对象 参数二:要设定的密码 参数三:密码的长度。例:sqlite3_key(db,"123456",6);

解密:

sqlite3_rekey是变更密码或给没有加密的数据库添加密码或清空密码,变更密码或清空密码前必须先正确执行sqlite3_key。

在正确执行sqlite3_rekey之后在sqlite3_close关闭数据库之前可以正常操作数据库,不需要再执行sqlite3_key。

sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),参数同上。清空密钥为sqlite3_rekey( db, NULL, 0)。

如果实在是想进行加密解密的话,那么我也不妨提出自己的两个建议吧!

建议一:掏钱购买吧!没什么可说的。

建议二:自己实现加密解密方法。对即将存入数据库的数据进行加密之后再进行保存,取数据的时候先进行解密再进行获取。

SQLite的管理

管理工具也有不少,这里介绍几款:

1、SQLite Manager是开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。

2、SQLite Administrator是一个用来管理 SQLite 数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。 

3、SQLite Database browser是一个 SQLite 数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。

QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持。

    QSqlDatabase对象象征了数据库的关联。Qt使用驱动程序与各种数据库的应用编程接口进行通信。Qt的桌面版(Desktop Edition)包括如下一些驱动程序:
 
 驱动程序  数据库 
 QDB2  IBM DB2 7.1版以及更新的版本 
 QIBASE  Borland InterBase
 QMYSQL  MySql 
 QOCI  甲骨文公司(Oracle Call Interface)
 QODBC   ODBC(包括微软公司的QSL服务)
 QPSQL   PostgreSQL的7.3版以及更高版本 
 QSQLITE  QSLite第3版 
 QSQLITE2  QSLite第2版
 QTDS   Qybase自适应服务器 
    
    由于授权的许可限制,Qt的开源版本无法提供所有的驱动程序,当配置Qt时,即可以选择Qt本身包含的SQL驱动程序,也可以以查件的形式建立驱动程序,公共领域中不断发展的SQLite数据库将向Qt提供支持。
    如下讨论关于Qt进行SQLite的基本操作。
 
代码如下:
 
  1 //添加数据库驱动、设置数据库名称、数据库登录用户名、密码
  2 QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); 
  3 database.setDatabaseName("database.db");
  4 database.setUserName("root");  
  5 database.setPassword("123456");
  6  
  7 //打开数据库
  8 if(!database.open())
  9 {  
 10 qDebug()<<database.lastError();
 11 qFatal("failed to connect.") ;
 12 }
 13 else
 14 {
 15 //QSqlQuery类提供执行和操作的SQL语句的方法。
 16 //可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE, 
 17 //以及DDL(数据定义语言)语句,例如CREATE TABLE。
 18 //也可以用来执行那些不是标准的SQL的数据库特定的命令。
 19 QSqlQuery sql_query; 
 20  
 21 QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
 22 QString select_max_sql = "select max(id) from student";
 23 QString insert_sql = "insert into student values (?, ?, ?)";
 24 QString update_sql = "update student set name = :name where id = :id";
 25 QString select_sql = "select id, name from student";
 26 QString select_all_sql = "select * from student";
 27 QString delete_sql = "delete from student where id = ?";
 28 QString clear_sql = "delete from student";
 29  
 30 sql_query.prepare(create_sql);
 31 if(!sql_query.exec())
 32 {
 33 qDebug()<<sql_query.lastError();
 34 }
 35 else
 36 {
 37 qDebug()<<"table created!";
 38 }
 39  
 40 //查询最大id
 41 int max_id = 0;
 42 sql_query.prepare(select_max_sql);
 43 if(!sql_query.exec())
 44 {
 45 qDebug()<<sql_query.lastError();
 46 }
 47 else
 48 {
 49 while(sql_query.next())
 50 {
 51 max_id = sql_query.value(0).toInt();
 52 qDebug()<"max id:%1").arg(max_id);
 53 }
 54 }
 55 //插入数据
 56 sql_query.prepare(insert_sql);
 57 sql_query.addBindValue(max_id+1);
 58 sql_query.addBindValue("name");
 59 sql_query.addBindValue(25);
 60 if(!sql_query.exec())
 61 {
 62 qDebug()<<sql_query.lastError();
 63 }
 64 else
 65 {
 66 qDebug()<<"inserted!";
 67 }
 68  
 69 //更新数据
 70 sql_query.prepare(update_sql);
 71 sql_query.bindValue(":name", "Qt");
 72 sql_query.bindValue(":id", 1);
 73 if(!sql_query.exec())
 74 {
 75 qDebug()<<sql_query.lastError();
 76 }
 77 else
 78 {
 79 qDebug()<<"updated!";
 80 }
 81  
 82 //查询部分数据
 83 if(!sql_query.exec(select_sql))
 84 {
 85 qDebug()<<sql_query.lastError();
 86 }
 87 else
 88 {
 89 while(sql_query.next())
 90 {
 91 int id = sql_query.value("id").toInt();
 92 QString name = sql_query.value("name").toString();
 93  
 94 qDebug()<"id:%1    name:%2").arg(id).arg(name);
 95 }
 96 }
 97  
 98 //查询所有数据
 99 sql_query.prepare(select_all_sql);
100 if(!sql_query.exec())
101 {
102 qDebug()<<sql_query.lastError();
103 }
104 else
105 {
106 while(sql_query.next())
107 {
108 int id = sql_query.value(0).toInt();
109 QString name = sql_query.value(1).toString();
110 int age = sql_query.value(2).toInt();
111  
112 qDebug()<"id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
113 }
114 }
115  
116 //删除数据
117 sql_query.prepare(delete_sql);
118 sql_query.addBindValue(max_id);
119 if(!sql_query.exec())
120 {
121 qDebug()<<sql_query.lastError();
122 }
123 else
124 {
125 qDebug()<<"deleted!";
126 }
127  
128 //清空表
129 sql_query.prepare(clear_sql);
130 if(!sql_query.exec())
131 {
132 qDebug()<<sql_query.lastError();
133 }
134 else
135 {
136 qDebug()<<"cleared";
137 }
138 }
139  
140 //关闭数据库
141 database.close();
142  
143 //删除数据库
144 QFile::remove("database.db");

 

 
可以通过一些工具对SQLite进行管理,如下:
 
Qt之操作数据库(SQLite)_第1张图片
 
SQLite的管理
管理工具挺多的,这里简单介绍几款:
  • SQLite Manager:开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
  • SQLite Administrator:一个用来管理SQLite数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。
  • SQLite Database browser:一个SQLite数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。

你可能感兴趣的:(Qt之操作数据库(SQLite))