Sqlite的相关使用

1.Sqlite简介

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

Sqlite的数据是存储在单个文件里面,因此你可以看作一个文件就是一个数据库。它使用起来较为方便,无须安装驱动,你的应用程序只须依赖Sqlite动态链接库,就可以进行相应的数据读取操作。它同样支持常用的SQL语法来进行增删改查。它最大的做点就是轻便,无须过多的依赖什么来完成数据操作。

2.Sqlite使用

2.1.环境配置

要在项目中使用Sqlite,那么先要对其项目环境进行配置。Sqlite开发所需要的文件都存放在一个Common文件夹里面,列表如下图所示:


将其拷贝到项目目录下面,然后在项目属性中进行相关设置,以VS2005为例进行介绍:

1)设置附加目录:

为了方便管理,Sqlite的头文件都在Common文件夹下面,为了方便在代码中调用,直接设置附加目录,这样就可以直接引用文件名,而不用再文件名前再加路径了。

2)设置附加依赖项:


3)将Sqlite文件添加到项目中去


2.2.基本操作

2.2.1.数据库的创建

constchar*gszFile="C:\\test.db";//数据库路径

CppSQLite3DBdb;

remove(gszFile);//清除当前路径的文件

db.open(gszFile);//如果数据库存在,则打开数据库,不存在,则创建数据库

2.2.2.表的创建

在表创建之前,要先进行检测该表是否存在,来避免出现错误:

db.tableExists("emp");//返回true则为该表已存在,false为不存在

当不存在同名的表,才进行创建

db.execDML("createtableemp(empnoint,empnamechar(20));");

创建完成后,同样可利用db.tableExists("emp")来进行判断,创建是否成功。

2.2.3.基本的SQL语句的执行

一般我们通过SQLite里面的execDML来执行SQL语句:

db.execDML("updateempsetnumcalls=10wheredayno=1;");

在进行增删改等涉及更新数据的操作时,最好是放在事务里面进行操作,一是有效的锁定数据库的使用状态,二是可以进行回滚操作。

如:

db.execDML("begintransaction;");

db.execDML("updateempsetnumcalls=10wheredayno=1;");

db.execDML("committransaction;");

2.2.4.数据操作的并发问题

SQLite可以允许多个用户或者线程同时执行查询操作,但最多却只允许一个用户在某一个时段进行数据更新操作。因此,我们在操作数据库的过程中,为了不排除数据库被其他的用户或者线程所占用,我们在使用的过程中,利用try…Catch…来进行捕捉异常,来避免数据库被占用而导致的错误。

try

{

intnRows=db.execDML("updateempsetnumcalls=100wheredayno=1;");

cout<<"Mainthread:updated"<<nRows<<"rows"<<endl;

}

catch(CppSQLite3Exception&e)

{

cout<<"Mainthread:"<<e.errorCode()<<":"<<e.errorMessage()<<endl;

}

2.3.主要类介绍

2.3.1.CppSQLite3Table

CppSQLite3Table是一个SQLite提供的用来专门存放一个完整的表结构,我们也可以通过CppSQLite3Table里面的一些方法和函数去读取这个表里面的内容。

CppSQLite3Tablet=db.getTable("select*fromemp;");

t.numFields();//返回表里面的总列数

t.fieldName(fld);//返回表里面第fld列的列名

t.numRows();//返回表里面的总行数

t.setRow(i);//i为所在表的第几行

t.fieldIsNull(field);//判断第几列是否为空,field是指该行的第几列数据

t.fieldValue(field);//读取第i行里面的第field列数据

例子:

CppSQLite3Tablet=db.getTable("select*fromemporderby1;");

for(fld=0;fld<t.numFields();fld++)

{

cout<<t.fieldName(fld)<<"|";

}

cout<<endl;

for(introw=0;row<t.numRows();row++)

{

t.setRow(row);

for(intfld=0;fld<t.numFields();fld++)

{

if(!t.fieldIsNull(fld))

cout<<t.fieldValue(fld)<<"|";

else

cout<<"NULL"<<"|";

}

cout<<endl;

}

2.3.2.CppSQLite3Query

CppSQLite3Query是SQLite里面用来存放查询的返回结果

CppSQLite3Queryq=db.execQuery("select*fromemporderby1;");

q.numFields();//返回这个数据集的总列数

q.fieldName(fld);//返回第fld列的列名

q.fieldDeclType(fld);//返回第fld列的的数据类型

q.fieldValue(0);//返回某一行的第0列的数据

q.nextRow();//指向数据集当前行的下一行

q.eof();//判断当前行是否为空

例子:

CppSQLite3Queryq=db.execQuery("select*fromemporderby1;");

for(fld=0;fld<q.numFields();fld++)

{

cout<<q.fieldName(fld)<<"("<<q.fieldDeclType(fld)<<")|";

}

cout<<endl;

while(!q.eof())

{

cout<<q.fieldValue(0)<<"|";

cout<<q.fieldValue(1)<<"|"<<endl;

q.nextRow();

}

2.3.3.CppSQLite3Buffer

CppSQLite3Buffer是SQLite里面提供的一个可包含特殊字符的字符串类型。比如在我们以前的程序中的SQL语句中,SQL语句里面涉及到单引号的情况:

CStringstr;

str.Append(select*fromtablewhereuid=‘”

str.Append(m_id);

str.Append();

有时候显得特别不方便,但是在SQLite里面,通过它提供的这个类型,我们可以这样使用:

CppSQLite3BufferbufSQL;

bufSQL.format("insertintoemp(empno,empname)values(%Q,%Q);",no,name);

db.execDML(bufSQL);

2.3.4.CppSQLite3Exception

CppSQLite3Exception是SQLite里面提供给我们进行捕获异常错误消息的类。可以捕获在我们使用SQLite的过程中出现的异常错误

例如:

try

{

……

}

catch(CppSQLite3Exception&e)

{

cout<<e.errorCode()<<":"<<e.errorMessage()<<endl;

}

2.3.5.CppSQLiteBinary

CppSQLite3Binary可以一些包含空格符、回车符的一些数据转换成相应的二进制数据和编码进行保存和读取,来保证这条数据的完整性。

可以通过setEncoded()和setBinary()方法来对数据进行转换。

通过getEncoded()andgetBinary()方法来进行获取数据。

通过getBinaryLength()来获取数据的长度。

例子:

unsignedcharbin[256];

CppSQLite3Binaryblob;

for(i=0;i<sizeofbin;i++)

{

bin[i]=i;

}

blob.setBinary(bin,sizeofbin);

bufSQL.format("insertintobindatavalues('testing',blob.getEncoded());

db.execDML(bufSQL);

cout<<"StoredbinaryLength:"<<sizeofbin<<endl;

q=db.execQuery("selectdatafrombindatawheredesc='testing';");

if(!q.eof())

{

blob.setEncoded((unsignedchar*)q.fieldValue("data"));

cout<<"RetrievedbinaryLength:"<<blob.getBinaryLength()<<endl;

}

q.finalize();

2.3.6.CppSQLite3Statement

如果要插入多条SQL语句,但这些SQL语句又仅仅只是插入的数据不一样,格式都是一样的话,那么就可以用这个CppSQLite3Statement来进行保存模版,然后只用往这个模版里面赋予不同的值,然后进行执行就可以。

例如:

db.execDML("begintransaction;");

CppSQLite3Statementstmt=db.compileStatement("insertintoempvalues(?,?);");

for(i=0;i<nRowsToCreate;i++)

{

charbuf[16];

sprintf(buf,"EmpName%06d",i);

stmt.bind(1,i);

stmt.bind(2,buf);

stmt.execDML();

stmt.reset();

}

db.execDML("committransaction;");

2.4.使用注意事项

① 在对SQLite嵌入式数据库使用时,首先要进行判断,判断存放SQLite数据库的文件是否存在,然后再进行操作。同样,对SQLite数据库里面的表进行操作时,也要先进行检测,检测表是否存在。

db.open(gszFile);//如果数据库存在,则打开数据库,不存在,则创建数据库

db.tableExists("emp");//返回true则为该表已存在,false为不存在

② 任何对数据进行更新操作的SQL语句,执行时,一定要放在事务里面进行操作。使用事务,一方面有利于数据回滚,另一方面可对数据库进行独占式操作。SQLite数据库允许多个用户同时进行读操作,但最多却只允许一个用户在某一时刻对数据库进行更新操作和多个用户进行读操作。

db.execDML("begintransaction;");

db.execDML("updateempsetnumcalls=10wheredayno=1;");

db.execDML("committransaction;");

③ 所有数据库的更新操作,一定要用TryCatch进行异常捕获处理,获取未知异常。

try

{

intnRows=db.execDML("updateempsetnumcalls=100wheredayno=1;");

cout<<"Mainthread:updated"<<nRows<<"rows"<<endl;

}

catch(CppSQLite3Exception&e)

{

cout<<"Mainthread:"<<e.errorCode()<<":"<<e.errorMessage()<<endl;

}

④ 在使用SQLite时,对于个表进行读操作的时候,要使用CppSQLite3Table来作为存放数据的容器。对于只对某个表的部分字段进行读操作的时候,要使用CppSQLite3Query来作为存放数据的容器。

⑤ 当要拼装一个SQL语句句,严禁使用CString等字符串进行拼装,要使用SQLite自带的CppSQLite3Buffer来进行组装SQL语句。

CppSQLite3BufferbufSQL;

bufSQL.format("insertintoemp(empno,name);

db.execDML(bufSQL);

⑥ 当某一个SQL语句,除了数据的内容不一样以外,所操作的表、字段都一样的使用,这个时候,要使用CppSQLite3Statement来进行保存模板,然后只对模板进行操作,这样可以省去很多SQL语句的编译时间,提高效率。

db.execDML("begintransaction;");

CppSQLite3Statementstmt=db.compileStatement("insertintoempvalues(?,buf);

stmt.execDML();

stmt.reset();

}

db.execDML("committransaction;");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="