SQLite3可以让我们手动的对SQLite数据库进行管理。一共有2个sqlite3,一个在电脑上,它位于 android-sdk-windows\tools\sqlite3.exe,用于电脑上SQLite数据库进行管理;还有一个位于Android系统上(手机上),它用于位于Android系统上的SQLite数据库进行管理,对于后者你需要通过adb shell进入shell。有时我们不想直接在Android系统上对SQLite数据库进行操作,这时可以把它拷贝到电脑上进行操作。
但是需要注意前者是Windows系统,后者是Linux系统,他们表示路径的方式不一样。
在SQLite3命令后可跟一个参数指定要打开或创建的数据库文件。如果指定的数据库文件还不存在,就会新建一个数据库,且以该参数作为文件名。对于Android系统上的SQLite3,必须通过其shell来运行,如果新建数据库的话,需要root权限,可以在shell中键入"su"来获得root权限。
如果是Android系统的sqlite3程序(通过shell运行),你可以Ctrl键+D ,然后回车退出该程序回到shell,也可以Ctrl键+C直接退出Shell,如果是电脑上的SQLite3,可以Ctrl键+C直接退出SQLite3程序。
下面就是一个创建包含一个名叫"tbl1"的表的名叫"ex1"的SQLite数据库的示例。
示例1:
java代码:
$ sqlite3 ex1
SQLite version 3.3.10
Enter ".help"forinstructions
sqlite> createtabletbl1(onevarchar(10), twosmallint);
sqlite> insertintotbl1values('hello!',10);
sqlite> insertintotbl1values('goodbye', 20);
sqlite> select*fromtbl1;
hello!|10
goodbye|20
sqlite>
SQLite3支持两种命令,一种是SQL命令,一种是非SQL命令,非SQL命令以"."作为前缀,比如".tables"命令。
可以通过".help"命令来查看它所有的非SQL命令.所有不以"."为前缀的语句,都将做SQL进行解释,当时对于SQL语句你需要在末尾加上分号";"以表示SQL语句输入完成,这时你输入的命令才开始按照SQL语言进行执行。
示例2:
java代码:
sqlite>CREATETABLEtbl2 (
...> f1 varchar(30)primarykey,
...> f2 text,
...> f3 real
...> );
sqlite>
关于数据库的schema是存放在一个叫sqlite_master的表中,你虽然不能对它进行DROP TABLE, UPDATE, INSERT or DELETE操作,但是可以像普通的表一样对它进行查询。
示例3:
java代码:
sqlite3 /data/data/com.android.providers.settings/databases/settings.db
SQLite version 3.6.22
Enter ".help"forinstructions
Enter SQL statements terminated witha";"
sqlite> .tables
.tables
android_metadata bookmarks system
bluetooth_devices secure
sqlite> select*fromsqlite_master;
select*fromsqlite_master;
table|android_metadata|android_metadata|3|CREATETABLEandroid_metadata (locale TEXT)
table|system|system|4|CREATETABLEsystem (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONCONFLICTREPLACE,value TEXT)
index|sqlite_autoindex_system_1|system|5|
table|sqlite_sequence|sqlite_sequence|6|CREATETABLEsqlite_sequence(name,seq)
index|systemIndex1|system|7|CREATEINDEXsystemIndex1ONsystem (name)
table|secure|secure|8|CREATETABLEsecure (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONCONFLICTREPLACE,value TEXT)
index|sqlite_autoindex_secure_1|secure|9|
index|secureIndex1|secure|10|CREATEINDEXsecureIndex1ONsecure (name)
table|bluetooth_devices|bluetooth_devices|11|CREATETABLEbluetooth_devices (_idINTEGERPRIMARYKEY,nameTEXT,addr TEXT,channelINTEGER,typeINTEGER)
table|bookmarks|bookmarks|12|CREATETABLEbookmarks (_idINTEGERPRIMARYKEY,tit
le TEXT,folder TEXT,intent TEXT,shortcut INTEGER,orderingINTEGER)
index|bookmarksIndex1|bookmarks|13|CREATEINDEXbookmarksIndex1ONbookmarks (folder)
index|bookmarksIndex2|bookmarks|14|CREATEINDEXbookmarksIndex2ONbookmarks (shortcut)
sqlite>
在sqlite3中我们可以通过".help"命令来查所有的非SQL命令。
sqlite3 8种不同的方式显示查询返回的结果:"csv", "column", "html", "insert", "line", "list","tabs", "tcl".
你可以通过.mode来设置显示的方式。默认的是"list"方式,这时返回结果的一条记录显示一行,每列的内容之间用设定的分隔符隔开,
默认的分隔符是"|".
示例5:
java代码:
sqlite> .mode list
sqlite> select*fromtbl1;
hello|10
goodbye|20
sqlite>
你可以通过".separator"来设置"list"模式下的分隔符。比如我们想把", "作为分隔符,可以这样:
示例6:
java代码:
sqlite> .separator", "
sqlite> select*fromtbl1;
hello, 10
goodbye, 20
sqlite>
"line"模式下, 每行只显示数据库的一行的一列。每行由列名,等号和列的值组成。每条记录之间由一个空行隔开。
示例7
java代码:
sqlite> .mode line
sqlite> select*fromtbl1;
one = hello
two = 10
one = goodbye
two = 20
sqlite>
"column"模式下,每条记录都在单独一行显示。***行显示的是列名,第二行只是用于分割列名和记录的数据,第三行开始才是记录的内容。
示例8:
java代码:
sqlite> .mode columnsqlite>select*fromtbl1;
one two
---------- ----------
hello 10
goodbye 20
sqlite>
默认情况下,每列的宽度最多只能显示10个字符。所以如果数据包含的字符如果他太多,可能就显示不完。
但是我们可以通过".width"设置每列的宽度。
示例9:
java代码:
sqlite> .width 12 6
sqlite> select*fromtbl1;
one two
------------ ------
hello 10
goodbye 20
sqlite>
示例9就把第1列和第二列的宽度分别设置为了12和6个字符,其他列的宽度并没改变。
如果你把列宽设置为0,那么调整为以下三个的***值:10,该列的列名字符数,***行记录该列的字符数。这样列的宽度就可以自动调整。
默认的列宽就是0,以便它可以自动调整。
可以通过".header"命令可以设置是否显示头(头包括***行,列名,第二行,分隔行)。
示例10:
java代码:
sqlite> .headeroff
sqlite> select*fromtbl1;
hello 10
goodbye 20
sqlite>
"insert"模式下,返回的查询结果将以SQL的INSERT语句形式进行显示。
示例11:
java代码:
sqlite> .modeinsertnew_table
sqlite> select*fromtbl1;
INSERTINTO'new_table'VALUES('hello',10);
INSERTINTO'new_table'VALUES('goodbye',20);
sqlite>
"html"模式下,查询返回结果将以XHTML table的形式进行显示,它并不以
作为结尾。 但是每条记录以作为开始,作为结束,记录的数据以作为开始,以作为结束示例12:
java代码:
sqlite>select*fromsystem;
select*fromsystem;
1volume_music74volume_voice4sqlite>
".output"命令可以把查询返回结果的输出定向到文件上。该命令的***个参数即是要定向的位置。在把输出定向了文件后,可以通过".output stdout"把输出重新定向到标准输出上。
示例13:
java代码:
sqlite> .mode list
sqlite> .separator |
sqlite> .outputtest_file_1.txt
sqlite> select*fromtbl1;
sqlite> .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$
sqlite3提供了多个命令来查看数据库的schema".tables"命令可以查看当前数据库所有的表
示例14:
java代码:
sqlite> .tables
tbl1
tbl2
sqlite>
".tables"和在list模式下执行下面的语句相似:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1
实际上, 如果你查看sqlite3程序的源码 (found in the source tree in the file src/shell.c), you'll find exactly the above query.
另外,".tables"命令后也可以跟一参数,它是一个pattern,这样命令就只列出表名和该参数匹配的表。
示例14-1:
java代码:
sqlite> .tables
.tables
android_metadata bookmarks system
bluetooth_devices secure
sqlite> .tables s%
.tables s%
secure sqlite_sequence system
sqlite>
".indices"命令列出指定表的所有indices(索引)。***个参数为表的名字。
示例15:
java代码:
sqlite> .schemasystem
.schemasystem
CREATETABLEsystem (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
ONFLICT REPLACE,value TEXT);
CREATEINDEXsystemIndex1ONsystem (name);
sqlite> .tables
.tables
android_metadata bookmarks system
bluetooth_devices secure
sqlite> .indices system
.indices system
sqlite_autoindex_system_1
systemIndex1
sqlite>
".schema"命令,在没有参数的情况,它会显示最初用于创建数据库的CREATE TABLE和CREATE INDEX的SQL语句。比如,示例16
".schema"命令可以包含一个参数,它是一个pattern,用于对表进行过滤,这时只会显示满足条件的表和所有索引的SQL语句。
比如,示例15和示例17.
示例16:
java代码:
sqlite> .schema
.schema
CREATETABLEandroid_metadata (locale TEXT);
CREATETABLEbluetooth_devices (_idINTEGERPRIMARYKEY,nameTEXT,addr TEXT,chan
nel INTEGER,typeINTEGER);
CREATETABLEbookmarks (_idINTEGERPRIMARYKEY,title TEXT,folder TEXT,intent TE
XT,shortcut INTEGER,orderingINTEGER);
CREATETABLEsecure (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
ONFLICT REPLACE,value TEXT);
CREATETABLEsystem (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
ONFLICT REPLACE,value TEXT);
CREATEINDEXbookmarksIndex1ONbookmarks (folder);
CREATEINDEXbookmarksIndex2ONbookmarks (shortcut);
CREATEINDEXsecureIndex1ONsecure (name);
CREATEINDEXsystemIndex1ONsystem (name);
sqlite>
示例17:
java代码:
sqlite> .schemas%
.schemas%
CREATETABLEsecure (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
ONFLICT REPLACE,value TEXT);
CREATETABLEsqlite_sequence(name,seq);
CREATETABLEsystem (_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
ONFLICT REPLACE,value TEXT);
CREATEINDEXsecureIndex1ONsecure (name);
CREATEINDEXsystemIndex1ONsystem (name);
sqlite>
【责任编辑:立方 TEL:(010)68476606】
点赞 0