Android sqlite3 详解
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。本文档提供一个使用sqlite3命令的简要说明。
启动sqlite3程序,仅仅需要敲入带有SQLite数据库名字的"sqlite3"命令即可。如果文件不存在,则创建一个新的(数据库)文件。然后sqlite3程序将提示你输入SQL。敲入SQL语句(以分号“;”结束),敲回车键之后,SQL语句就会执行。
例如,创建一张"tb11"表,你可以这样做:
复制代码
C:\Users\Administrator>adbshell
#sqlite3
SQLiteversion3.5.9
Enter".help"forinstructions
sqlite>createtabletb_stu(idsmallint,namevarchar(10));
sqlite>insertintotb_stuvalues(1,'zhangsan');
sqlite>insertintotb_stuvalues(2,'lisi');
sqlite>.modecolumn
sqlite>.width10
sqlite>select*fromtb_stu;
1zhangsan
2lisi
sqlite>
复制代码
你可以通过敲你所用系统的文件结束符(通常是Ctrl+D)或者中断字符(通常是Ctrl+C),来终止sqlite3程序。确定你在每个SQL语句结束敲入分号!sqlite3程序通过查找分号来决定一个SQL语句的结束。如果你省略分号,sqlite3将给你一个连续的命令提示符并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句,例如:
sqlite>createtabletb_stu(
createtabletb_stu(
...>idsmallint,
...>namevarchar(10)
...>);
);
题外话:查询SQLITE_MASTER表
SQLite数据库的表数据结构被保存在一个名叫"sqlite_master"的特殊的表中。你可以像查询其它表一样通过执行“SELECT”查询这个特殊的表。
sqlite>select*fromsqlite_master;
tabletb_stutb_stu2CREATETABLEtb_stu(idsmallint,namevarchar(10))
sqlite>
但你不能在sqlite_master表中执行诸如DROPTABLE,UPDATE,INSERT或者DELETE命令。sqlite_master表在你创建、删除和索引数据库时自动更新这个表。你不能手工更改sqlite_master表。
TEMPORARY表的结构没有存储在"sqlite_master"表中,由于TEMPORARY表对应用是不可见的,而不是应用程序创建这个表。TEMPORARY表结构被存储在另外一个名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是临时表自身。
sqlite3的特殊命令
大多数时候,sqlite3读入输入行,并把它们传递到SQLite库中去运行。但是如果输入行以一个点(“.”)开始,那么这行将被sqlite3程序自己截取并解释。这些“点命令”通常被用来改变查询输出的格式,或者执行鞭个预封包(预定义prepackaged)的查询语句。
你可以在任何时候输入“.help”,列出可用的点命令。例如
复制代码
sqlite>.help
.bailON|OFFStopafterhittinganerror.DefaultOFF
.databasesListnamesandfilesofattacheddatabases
.dump?TABLE?...DumpthedatabaseinanSQLtextformat
.echoON|OFFTurncommandechoonoroff
.exitExitthisprogram
.explainON|OFFTurnoutputmodesuitableforEXPLAINonoroff.
.header(s)ON|OFFTurndisplayofheadersonoroff
.helpShowthismessage
.importFILETABLEImportdatafromFILEintoTABLE
.indicesTABLEShownamesofallindicesonTABLE
.loadFILE?ENTRY?Loadanextensionlibrary
.modeMODE?TABLE?SetoutputmodewhereMODEisoneof:
csvComma-separatedvalues
columnLeft-alignedcolumns.(See.width)
htmlHTML<table>code
insertSQLinsertstatementsforTABLE
lineOnevalueperline
listValuesdelimitedby.separatorstring
tabsTab-separatedvalues
tclTCLlistelements
.nullvalueSTRINGPrintSTRINGinplaceofNULLvalues
.outputFILENAMESendoutputtoFILENAME
.outputstdoutSendoutputtothescreen
.promptMAINCONTINUEReplacethestandardprompts
.quitExitthisprogram
.readFILENAMEExecuteSQLinFILENAME
.schema?TABLE?ShowtheCREATEstatements
.separatorSTRINGChangeseparatorusedbyoutputmodeand.import
.showShowthecurrentvaluesforvarioussettings
.tables?PATTERN?ListnamesoftablesmatchingaLIKEpattern
.timeoutMSTryopeninglockedtablesforMSmilliseconds
.widthNUMNUM...Setcolumnwidthsfor"column"mode
sqlite>
复制代码
改变输出格式
sqlite3程序可以以八种不同的格式显示一个查询的结果:"csv","列","html","插入","行","制表"和"tcl"。你可以用".mode"点命令在这些输出格式之间切换。
默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(“|”)。列表符号在当你输出查询结果到另外一个符加处理的程序(如AWK)中去是尤为有用。
sqlite>.modelist
sqlite>select*fromtb_stu;
1|zhangsan
2|lisi
sqlite>
你可以用“.separator”点命令来改变分界符。例如,为了把分割符改为一个逗号和一个空格,你可以这样做:
复制代码
sqlite>.separator''
sqlite>select*fromtb_stu;
1zhangsan
2lisi
sqlite>
或者
sqlite>.separator','
sqlite>select*fromtb_stu;
1,zhangsan
2,lisi
sqlite>
复制代码
在“line"模式下,每一个位于条记录中的列在它自己那行显示。每行由列名、一个等号和列数据组成。下一条记录以一个空行隔开。这是一个行模式输出的例子:
复制代码
sqlite>.modeline
sqlite>select*fromtb_stu;
id=1
name=zhangsan
id=2
name=lisi
sqlite>
复制代码
在列模式下,每条记录在一个单独的行中以数据列对齐的方式显示。列如:
sqlite>.modecolumn
sqlite>select*fromtb_stu;
1zhangsan
2lisi
sqlite>
在默认的情况下,每列至少10个字符宽。太宽的数据将被截取。你可以用“.width”命令来调整列宽。如下所示:
复制代码
--每一列列宽都为10
sqlite>.width10
sqlite>select*fromtb_stu;
1zhangsan
2lisi
sqlite>
--设置第一列宽为12第二列宽为6。其它的列宽不变
sqlite>.width126
sqlite>select*fromtb_stu;
1zhangsan
2lisi
sqlite>
复制代码
上面例子中".width"命令设置第一列宽为12第二列宽为6。其它的列宽不变。你可以指定与你查询结果需要的列数一样多的“.width”参数。
如果你指定一列宽为0,那么这个列宽将自动以下面三个数字中的最大值做为列宽:10、表头宽度和最宽的数据列的宽度。这可以让列自动调整宽度。每列的默认设置为自动调整的0值。
出现在输出开头两行的列标示可以用".header"点命令关闭。在上面的例子中,列标示是打开的。可以用下面的方法关闭列标示:
sqlite>.headeroff
sqlite>select*fromtb_stu;
1zhang
2lisi
sqlite>
另外一个有用的输出模式是"insert"。在插入模式下,被子格式化为看起来像SQLINSERT语句的样式。你可以用插入模式来产生文件(便于)以后用于不同数据库的输入。
当指定插入模式时,你必须给定一个特定参数就是要插入的表名。例如:
sqlite>.modeinserttb_stu_temp
sqlite>select*fromtb_stu;
INSERTINTOtb_stu_tempVALUES(1,'zhangsan');
INSERTINTOtb_stu_tempVALUES(2,'lisi');
sqlite>
最新的输出格式是“html”。在这种模式下,sqlite3把查询的结果写做XHTML表。开始的<TABLE>和结束的</TABLE>(标记)没有写出,但有<TR>、<TH>和<TD>等分界符。html输出对CGI来说是相当有用地。
把结果写到文件中
默认情况下,sqlte3把结果送到标准输出。你可以用“.output”命令改变它。只须把输出文件名做为.output命令的输出参数然后所有后续查询结果将被写到那个文件中。用“.outputstdout”再一次改为标准输出。例如:
复制代码
sqlite>.separator|
sqlite>.outputtb_stu_temp.txt
sqlite>select*fromtb_stu;
sqlite>.exit
#cattb_stu_temp.txt
hello|10
goodbye|20
复制代码
查询数据库结构
sqlite3程序提供几个有用的用于查询数据库结构的快捷命令。这些不是不可以用别的方式来实现。这些命令仅仅是一个快捷方式而已。
例如,为了查看数据库的所有表,你可以敲入“.tables”。
“.tables”命令相似于设置列表模式然后执行接下来的查询:
.databases列出数据库文件名
.tables?PATTERN?列出?PATTERN?匹配的表名
.importFILETABLE将文件中的数据导入的文件中
.dump?TABLE?生成形成数据库表的SQL脚本
.outputFILENAME将输出导入到指定的文件中
.outputstdout将输出打印到屏幕
.modeMODE?TABLE?设置数据输出模式(csv,html,tcl…
.nullvalueSTRING用指定的串代替输出的NULL串
.readFILENAME执行指定文件中的SQL语句
.schema?TABLE?打印创建数据库表的SQL语句
.separatorSTRING用指定的字符串代替字段分隔符
.show打印所有SQLite环境变量的设置
.quit退出命令行接口
数据类型
sqlite3对字段没有严格要求,字段可以存储任何类型数据,它会适时的自动转换,当然,你也可以创建表的时候对数据类型进行定义。
sqlite3包含null、integer、real、text、blob等数据类型,但实际上sqlite3也接收如下数据类型:
smallint16位的整数。
interger32位的整数。
decimal(p,s)指定精度或对象能够控制的数字个数。
p:小数点左边和右边数字之和,不包括小数点。如123.45,则p=5,s=2。
s:小数点右边的位数或个数。
float32位的浮点数。
double64位的浮点数。
char(n)n长度的字符串,n不能超过254。
varchar(n)长度不固定且其最大长度为n的字符串,n不能超过4000。
graphic(n)和char(n)一样,不过其单位是两个字元double-bytes,n不能超过127。这个形态是为了支援两个字节长度的字体,例如中文字。
vargraphic(n)可变长度且其最大长度为n的双字元字串,n不能超过2000
date包含了年份、月份、日期。
time包含了小时、分钟、秒。
timestamp包含了年、月、日、时、分、秒、千分之一秒。
查看
.databases显示数据库信息(好像.database也可以)
.tables显示所有表名(好像.table也可以)
.schema查看所有表的数据结构;
.schematable_name查看某表的数据结构
插入记录
insertintotable_namevalues(field1,field2,field3...);
查询
select*fromtable_name;查看table_name表中所有记录;
select*fromtable_namewherefield1='xxxxx';查询符合指定条件的记录;
删除
droptable_name;删除表;
dropindex_name;删除索引;
改变输出格式
.modelist|column|insert|line|tabs|tcl|csv
.separator","更改分界符号为,
.width5每列宽度为5
更改输出
.outputfile_name|stdout
接下来演示如何在android项目中操作数据库?
1)、首先在myeclipse中新建一个android项目命名为testprj,并运行项目;
2)、操作数据库,因为sqlite数据库存放在/data/data/package/目录下,我们可以通过cd命令进入/data/data/package/目录下进行数据库的操作:
adbshell#进入linux命令环境
cd/data/data/com.ljq.activity/#进入/data/data/com.ljq.activity/目录下
sqlite3test.db#进入sqlite的操作环境,如果文件存在,则直接打开
createtabletb_stu(idsmallint,namevarchar(20),pwdvarchar(6))#新建一张tb_stu表
insertintotb_stuvalues(1,'zhangsan','123456');
insertintotb_stuvalues(2,'lisi','123456');