热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

全方位认识SQLite(一)

作者:奋斗ing丶孩子转自:http:blog.sina.com.cnsblog_a6fb6cc90101ffmq.htmlSQLite简介SQLite,是一款轻型的数据库,是遵守ACID的关

作者:奋斗ing丶孩子

转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101ffmq.html


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包括:

  ATTACHDATABASE

  BEGINTRANSACTION

  comment

  COMMITTRANSACTION

  COPY

  CREATE INDEX

  CREATE TABLE

  CREATETRIGGER

  CREATE VIEW

  DELETE

  DETACHDATABASE

  DROP INDEX

  DROP TABLE

  DROP TRIGGER

  DROP VIEW

  ENDTRANSACTION

  EXPLAIN

  expression

  INSERT

  ON CONFLICTclause

  PRAGMA

  REPLACE

  ROLLBACKTRANSACTION

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

  CREATE TABLEex2(

  aVARCHAR(10),

  bNVARCHAR(15),

  c TEXT,

  d INTEGER,

  e FLOAT,

  f BOOLEAN,

  g CLOB,

  h BLOB,

  i TIMESTAMP,

  jNUMERIC(10,5)

  k VARYING CHARACTER(24),

  l NATIONAL VARYINGCHARACTER(16)

  );

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

如何连接SQLite?

用PHP操作sqlite数据库

  a、如何连接sqlite数据库?

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

  select * fromsqlite_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 'talbename='.$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 nameemail

  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 SETemail="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包的导入。步骤:右击工程->BuildPath->Config Build Path->Libraries->Add ExternalJars选择你要导入的SQLite的jar包

示例代码

packagewang.liang;

importjava.sql.*;

 

public classTestSQLite {

      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/SQLitecode/testSQLite.db");

                    Statement stat = conn.createStatement();

//创建一个表,两列

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

//插入数据

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

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

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

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

                    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数据库文件的连接并返回一个数据库连接对象。这通常是应用程序调用的第一个SQLiteAPI接口而且也是调用其他SQLiteAPI接口前需要调用的接口。许多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()接口返回那一行中所有列的数据。就像上面所说的那样,SQLiteAPI中并没有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

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

下载PrecompiledBinaries 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,然后便携自己的主程序。

 注:

   技术在于交流、沟通,转载请注明出处并保持作品的完整性。   作者:╰☆奋斗ing❤孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101ffmq.html。


推荐阅读
  • Answer:Theterm“backslash”isonofthemostincorrectlyusedtermsincomputing.People ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 来吹下汽车
    最近帮同事的一个朋友选车,最后他决定了一汽大众的迈腾,也就是海外版(欧洲为主)的帕萨特B8,国内如果加长过的话,应该叫B8L吧。基于大众最新的通用MQB平台(模块化横置发动机平台) ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • 无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)
    1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例。这是上次写的iOS第三方社交分享:http:www.cnblogs.comqingchep3727559.html ... [详细]
  • 浅析对象 VO、DTO、DO、PO 概念
    作者|CatQi链接|cnblogs.comqixuejiap4390086.html前言由于此订阅号换了个皮肤,导致用户接受文章不及时。读者可以打开订阅号「Web项 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
author-avatar
表发给上完善
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有