
1.SQLite简介
SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
它能够支持 Windows/Linux/Unix等等主流的 *** 作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java、C++、.Net等,还有ODBC接口,同样比起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
2.SQLite的特点:
轻量级
SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库,就可以享受它的全部功能。
而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。
不需要"安装"
SQLite的核心引擎本身不依赖第三方的软件,使用它也不需要"安装"。有点类似那种绿色软件。
单一文件
数据库中所有的信息(比如表、视图等)都包含在一个文件内。这个文件可以自由复制到其它目录或其它机器上。
跨平台/可移植性
除了主流 *** 作系统 windows,linux之后,SQLite还支持其它一些不常用的 *** 作系统。
弱类型的字段
同一列中的数据可以是不同类型
开源
3.SQLite数据类型
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME: 包含了 小时、分钟、秒。
二.SQLiteDatabase的介绍
Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了 *** 作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。
SQLiteDatabase的常用方法
方法名称
方法表示含义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
打开或创建数据库
insert(String table,String nullColumnHack,ContentValues values)
插入一条记录
delete(String table,String whereClause,String[] whereArgs)
删除一条记录
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)
查询一条记录
update(String table,ContentValues values,String whereClause,String[] whereArgs)
修改记录
execSQL(String sql)
执行一条SQL语句
close()
关闭数据库
Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法
1、打开或者创建数据库
在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库。
它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。
下面是创建名为“stu.db”数据库的代码:
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
参数1 数据库创建的路径
参数2 一般设置为null就可以了
eg: db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null)
2、创建表
创建一张表的步骤很简单:
编写创建表的SQL语句
调用SQLiteDatabase的execSQL()方法来执行SQL语句
下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)
View Code
3、插入数据
ContentValues 是一种存储的机制,常用于数据库的 *** 作。只能存储基本类型。
插入数据有两种方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,
参数1 表名称,
参数2 空列的默认值
参数3 ContentValues类型的一个封装了列名称和列值的Map;
View Code
②编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
View Code
4、删除数据
删除数据也有两种方法:
①调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
参数1 表名称
参数2 删除条件
参数3 删除条件值数组
View Code
②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
View Code
5、修改数据
修改数据有两种方法:
①调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
参数1 表名称
参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件(where字句)
参数4 更新条件数组
View Code
②编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
View Code
6、查询数据
在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
方法名称
方法描述
getCount()
获得总的数据项数
isFirst()
判断是否第一条记录
isLast()
判断是否最后一条记录
moveToFirst()
移动到第一条记录
moveToLast()
移动到最后一条记录
move(int offset)
移动到指定记录
moveToNext()
移动到下一条记录
moveToPrevious()
移动到上一条记录
getColumnIndexOrThrow(String columnName)
根据列名称获得列索引
getInt(int columnIndex)
获得指定列索引的int类型值
getString(int columnIndex)
获得指定列缩影的String类型值
下面就是用Cursor来查询数据库中的数据,具体代码如下:
View Code
7、删除指定表
编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
View Code
三. SQLiteOpenHelper
该类是SQLiteDatabase一个辅助类。这个类主要生成一 个数据库,并对数据库的版本进行管理。
当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。
SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:
1.onCreate(SQLiteDatabase)
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。
2. onUpgrade(SQLiteDatabase,int,int)
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的 *** 作,完全取决于应用的需求。
3. onOpen(SQLiteDatabase):
这是当打开数据库时的回调函数,一般在程序中不是很常使用。
写了这么多,改用用实际例子来说明上面的内容了。
下面这个 *** 作数据库的实例实现了创建数据库,创建表以及数据库的增删改查的 *** 作。
该实例有两个类:
com.lingdududu.testSQLite 调试类
com.lingdududu.testSQLiteDb 数据库辅助类
SQLiteActivity.java
View Code
StuDBHelper.java
View Code
main.xml
View Code
程序运行的效果图:
使用adb命令查看数据库:
1.在命令行窗口输入adb shell回车,就进入了Linux命令行,现在就可以使用Linux的命令了。
2.ls回车,显示所有的东西,其中有个data。
3.cd data回车,再ls回车,cd data回车,ls回车后就会看到很多的com................,那就是系统上的应用程序包名,找到你数据库程序的包名,然后进入。
4.进去后在查看所有,会看到有databases,进入databases,显示所有就会发现你的数据库名字,这里使用的是"stu_db"。
5.sqlite3 stu_db回车就进入了你的数据库了,然后“.schema”就会看到该应用程序的所有表及建表语句。
6.之后就可以使用标准的SQL语句查看刚才生成的数据库及对数据执行增删改查了。
注:ls,cd等命令都是linux的基本命令,不了解的同学可以看看有关这方面的资料。
下面介绍几个在SQLite中常用到的adb命令:
查看
.database 显示数据库信息;
.tables 显示表名称;
.schema 命令可以查看创建数据表时的SQL命令;
.schema table_name 查看创建表table_name时的SQL的命令;
插入记录
insert into table_name values (field1, field2, field3...)
查询
select * from table_name查看table_name表中所有记录;
select * from table_name where field1='xxxxx'查询符合指定条件的记录;
删除
drop table_name删除表;
drop index_name删除索引;
-------------------------------------------查询,插入,删除等 *** 作数据库的语句记得不要漏了----------------------------------------
# sqlite3 stu_db
sqlite3 stu_db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ""
sqlite>.schema
.schema
CREATE TABLE android_metadata (locale TEXT)
CREATE TABLE stu_table(id int,sname varchar(20),sage int,ssex varchar(10))--->创建的表
sqlite>select * from stu_table
select * from stu_table
1|xiaoming|21|male
sqlite>
插入数据
sqlite>insert into stu_table values(2,'xiaohong',20,'female')
插入的数据记得要和表中的属性一一对应
insert into stu_table values(2,'xiaohong',20,'female')
sqlite>select * from stu_table
select * from stu_table
1|xiaoming|21|male
2|xiaohong|20|female -------------->插入的数据
sqlite>
当点击修改数据的按钮时候
sqlite>select * from stu_table
select * from stu_table
1|xiaoming|23|male -------------->年龄被修改为23
2|xiaohong|20|female
sqlite>
当点击删除数据的按钮
sqlite>select * from stu_table
select * from stu_table
1|xiaoming|23|male id=2的数据已经被删除
总之,我们可以在代码中执行数据库的增删改查,也可以在adb命令行下实现。不过因为SQLite没有客户端,不能直接的查看数据库变化后的信息,所以常用adb命令行查看数据库改变后的信息。
前面用到的数据库,表都是自己在代码中创建,下面介绍如何使用外部已有的数据库的方法:
先用SQLite管理工具,sqliteadmin 具体 *** 作很简单,在这里我就不详细介绍的了,但有一个地方时候很值得注意的,就是用sqliteadmin创建数据库的时候,数据库保存的路径不能是中文路径,中文路径会出现下面的错误提示:
我在sqliteadmin 创建好数据库StuDB,:
将创建好的数据库在DDMS中点击导入到data/data/程序的包名/
1.SQLite数据库特点(1)SQLite数据库是开源的嵌入式数据库,无需独立的数据库引擎,直接嵌入到应用程序进程中,因此,通过API,应用程序可以直接 *** 作它。(2)事务的处理是原子的,一致的,独立的,可持久化的(ACID),即使在系统崩溃和掉电后。(3)SQLite数据库通过独占性与共享锁来实现事务的独立处理。(4)一个单独的跨平台的磁盘文件就能够存储一个数据库。(5)能支持2TB级的数据。(6)自包含,无外部依赖性。(7)支持NULL,INTEGER,NUMERIC,REAL,TEXT和BLOG等数据类型。(8)SQLite数据库没有用户帐户的概念。数据库的权限仅依赖于文件系统。2.SQLite数据库的基本 *** 作(1)建立数据库sqlite3data.sqlite3在当前目录下建立了名为data.sqlite3的数据库。(2)建立数据表createtablecall_list(idINTEGERPRIMARYKEY,typeNUMERIC,telnumNUMERIC,bttimeTEXT,tcountNUMERIC,charge_rateNUMERIC,charge_sumNUMERIC)建立了名为call_list的数据表,有7个字段,分别为id,type,telnum,bttime,tcount,charge_sum.charge_rate.(3)向数据表中插入数据insertintocall_listvalues($num,1,2,'new',4,5,6)(4)查询数据表中的数据select*fromcall_list(5)修改call_list表中的数据updatecall_listsetid=00001000whereid=10001(6)删除表中的数据记录deletefromcall_listwhereid=1000(7)SQlite中的其它常用命令.tables-列出所有的数据库中的数据表.schematablename-列出指定数据表的结构.quit-离开数据库(8)SQLite数据库的导入与导出a.将data.sqlite数据库的数据全部导出:sqlite3data.sqlite>.outputdd.sql>.dump这样,数据就保存在dd.sql的文件中,注意这个文件不是数据库,而是SQL语句。然后再把这些数据导入到另外一个数据库data1.sqlite数据库中。sqlite3data1.sqlite>.readdd.sql这样,数据就从data.sqlite数据库复制到data1.sqlite数据库中去了。b.将数据表中的数据导出到a.txt中去.outputa.txt//输出重定向到a.txtselect*fromcall_listc.将导出的表中的数据导入到另一个数据库的新建的表中去如:当从data.sqlite中的call_list表中导出了数据,再导入到另外一个数据库表call中去。首先建立表call.然后.importa.txtcall即可。3.C语言 *** 作Sqlite数据库API:intsqlite3_open(constchar*filename,sqlite3**ppdb)第一个参数用来指定数据库文件名。第二个参数是一个数据库标识符指针。如果打开数据库成功,则返回0,否则返回一个错误代码。intsqlite3_close(sqlite3*)传递的参数是数据库标识符指针用来关闭数据库, *** 作成功是返回0,否则返回一个错误代码。intsqlite3_errcode(sqlite3*db)constchar*sqlite3_errmsg(sqlite3*db)constchar*sqlite3_errmsg16(sqlite3*db)这三个函数都是返回错误信息,第一个函数返回的是最近调用数据库接口的错误代码,第二,第三个函数是返回最近调用数据库接口的错误信息。第二个函数返回的错误信息是用UTF-8编码的,第三个函数返回的错误信息是用UTF-16编码的。intsqlite3_exec(sqlite3*,constchar*sql,int(*callback)(void*,int,char**,char**),void*,**errmsg)这个函数非常重用,是用来执行SQLite数据库的SQL语句的。第一个参数是sqlite数据库标识符指针。第二个参数是要执行的SQL语句。第三个参数是一个回调函数,在执行查询 *** 作时用到,其它的 *** 作可以传空值即NULL。第四个参数是传递给回调函数第一个参数的实参。第五个参数是一个错误信息。回调函数:intcallback(void*,intargc,char**argv,char**cname)第一个参数是从sqlite3_exec传递过来的参数,可以为任意的类型。第二个参数是查询的列数。第三个参数是查询结果集的值。第四个参数是列名。intsqlite3_get_table(sqlite3*db,constchar*sql,char***result,int*row,int*col,char**errmsg)这个函数主要是用来查询的。第一个参数是数据库描述符指针第二个参数是SQL语句。第三个参数是查询的结果集。第四个参数是结果集中的行数。第五个参数是结果集中的列数。第六个参数是错误信息。它查询出的行数是从字段名开始的。即第0行是字段名。实例:/**本例主要实现用Sqlite的回调函数进行查询intsqlite3_exec(sqlite3*,constchar*sql,int(*callback)(void*,int,char**,char**),void*,errmsg)第一个参数是数据库标识符第二个参数是要执行的sql命令第三个参数是回调函数第四个参数是回调函数的第一个参数第五个参数是用于指示错误信息其中回调函数的形式:int_sql_callback(void*arg,intargc,char**argv,char**cname)第二个参数指示结果集中的列数第三个参数是保存结果集的字符串第四个参数是结果集中的列名**/#include#include#include#include#include#includeint_call_back(void*arg,intargc,char**argv,char**cname)intmain(){intresconstchar*dbfile="data.sqlite1"char*errmsg=NULLsqlite3*dbres=sqlite3_open(dbfile,&db)if(res!=0){perror("数据库打开失败")exit(EXIT_FAILURE)}//创建一张数据表constchar*sqlcreate="createtablecall_list(idINTEGERPRIMARYKEY,typeNUMERIC,telnumNUMERIC,bttimeTEXT,tcountNUMERIC,charge_rateNUMERIC,charge_sumNUMERIC)"res=sqlite3_exec(db,sqlcreate,NULL,NULL,&errmsg)if(res!=0){perror("建立数据表失败")exit(EXIT_FAILURE)}//插入100000条数据intnum=0structtimevaltvgettimeofday(&tv,NULL)longold=tv.tv_secwhile(num<100000){constchar*sqlinsert="insertintocall_listvalues($num,1,2,'new',4,5,6)"res=sqlite3_exec(db,sqlinsert,NULL,NULL,&errmsg)//插入时不需要用到回调函数if(res!=0){perror("插入失败")exit(EXIT_FAILURE)}num++}gettimeofday(&tv,NULL)printf("插入100000条数据的时间为:%d秒/n",(tv.tv_sec-old))//更新constchar*sqlupdate="updatecall_listsetid=00001000whereid=10001"res=sqlite3_exec(db,sqlupdate,NULL,NULL,&errmsg)if(res!=0){perror("更新数据失败")exit(EXIT_FAILURE)}//删除constchar*sqldelete="deletefromcall_listwhereid=1000"res=sqlite3_exec(db,sqldelete,NULL,NULL,&errmsg)if(res!=0){perror("删除数据失败")exit(EXIT_FAILURE)}//查询constchar*sqlquery="select*fromcall_list"res=sqlite3_exec(db,sqlquery,&_call_back,NULL,&errmsg)if(res!=0){printf("%s/n",errmsg)perror("执行失败/n")exit(EXIT_FAILURE)}res=sqlite3_close(db)if(res!=0){perror("数据库关闭失败")exit(EXIT_FAILURE)}exit(EXIT_SUCCESS)}int_call_back(void*arg,intargc,char**argv,char**cname){inti//二重指针可以看成指针数组for(i=0i欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)