Android對數(shù)據(jù)庫的使用是很重要的操作全封,由此開始系統(tǒng)的學(xué)習(xí)吧~
目錄
- 1.SQLite是什么
- 2.使用
- 3.SQLite語句
- 4.Android使用SQLite
1 SQLite是什么
SQLite 是一個進(jìn)程內(nèi)的庫翘瓮,不需要在系統(tǒng)中配置偏友。通過靜態(tài)或動態(tài)連接,使其直接訪問存儲的文件忘衍。
SQLite 是非常小的,是輕量級的卿城,完全配置時小于 400KB枚钓,省略可選功能配置時小于250KiB。
SQLite(關(guān)系型數(shù)據(jù)庫) 事務(wù)是完全兼容 ACID 的瑟押,允許從多個進(jìn)程或線程安全訪問秘噪。
與之進(jìn)行交互的命令類似于 SQL,命令包括:
-
CREATE
:創(chuàng)建一個新的表勉耀,一個表的視圖指煎,或者數(shù)據(jù)庫中的其他對象。 -
ALTER
:修改數(shù)據(jù)庫中的某個已有的數(shù)據(jù)庫對象便斥,比如一個表至壤。 -
SELECT
:從一個或多個表中檢索某些記錄。 -
INSERT
:創(chuàng)建一條記錄枢纠。 -
UPDATE
:修改記錄像街。 -
DELETE
:刪除記錄。 -
DROP
:刪除整個表晋渺,或者表的視圖镰绎,或者數(shù)據(jù)庫中的其他對象。
2 使用(需要Root??)
2.1 安裝
客戶端開發(fā)無需安裝SQLite木西,如要安裝在電腦上請參考Windows & Mac 安裝
Android手機(jī)和7.0以上的模擬器是沒root權(quán)限的畴栖!本文使用的是6.0模擬器,默認(rèn)root八千。
2.2 使用SQLite命令
??注意:# 符號表示已經(jīng)root了吗讶,如果是 $ 美元符號燎猛,則說明沒有root,不可以使用sqlite命令照皆!建議使用6.0的Android模擬器??
由于不知道文章編輯器怎么轉(zhuǎn)義重绷,以下所有 #
被我替換成了 >
shell進(jìn)去后鍵入一個簡單的sqlite3
命令,即可進(jìn)入數(shù)據(jù)庫模式:
$ adb shell
root@generic_x86_64:/ > sqlite3
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
.help命令獲取幫助 :
sqlite>.help
部分 SQLite 命令如下:
命令 | 描述 |
---|---|
.backup ?DB? FILE | 備份 DB 數(shù)據(jù)庫(默認(rèn)是 "main")到 FILE 文件膜毁。 |
.databases | 列出數(shù)據(jù)庫的名稱及其所依附的文件昭卓。 |
.exit | 退出 SQLite 提示符。 |
.help | 顯示消息瘟滨。 |
.echo ON/OFF | 開啟或關(guān)閉 echo 命令候醒。 |
.header(s) ON/OFF | 開啟或關(guān)閉頭部顯示。 |
.import FILE TABLE | 導(dǎo)入來自 FILE 文件的數(shù)據(jù)到 TABLE 表中室奏。 |
.load FILE ?ENTRY? | 加載一個擴(kuò)展庫火焰。 |
.nullvalue STRING | 在 NULL 值的地方輸出 STRING 字符串。 |
.output FILENAME | 發(fā)送輸出到 FILENAME 文件胧沫。 |
.output stdout | 發(fā)送輸出到屏幕昌简。 |
.stats ON/OFF | 開啟或關(guān)閉統(tǒng)計。 |
.quit | 退出 SQLite 提示符绒怨。 |
.read FILENAME | 執(zhí)行 FILENAME 文件中的 SQL纯赎。 |
.show | 顯示各種設(shè)置的當(dāng)前值。 |
.timeout MS | 嘗試打開鎖定的表 MS 毫秒南蹂。 |
.width NUM NUM | 為 "column" 模式設(shè)置列寬度犬金。 |
.timer ON/OFF | 開啟或關(guān)閉 CPU 定時器。 |
讓我們嘗試使用.show
命令六剥,來查看 SQLite 命令提示符的默認(rèn)設(shè)置:
sqlite>.show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: "|"
rowseparator: "\n"
stats: off
width:
filename: :memory:
sqlite>
確保
sqlite>
提示符與點命令
之間沒有空格晚顷,否則將無法正常工作。
使用下列的命令配置 (后面查詢的時候更好看一些):
sqlite>.header on
sqlite>.mode column
sqlite>.timer on
sqlite>
為了便于學(xué)習(xí)疗疟,我們在/data
目錄下創(chuàng)建test
文件夾该默,然后創(chuàng)建名為DBtest.db
的數(shù)據(jù)庫文件(>后面是shell命令):
$ adb shell
root@generic_x86_64:/data > mkdir test
root@generic_x86_64:/data > cd test/
root@generic_x86_64:/data/test > sqlite3 DBtest.db
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite>
使用sqlite3 DBtest.db
命令,進(jìn)入一個數(shù)據(jù)庫策彤。
sqlite_master表存儲了數(shù)據(jù)庫所有表的關(guān)鍵信息栓袖,我們可以查詢此表的概要(由于剛創(chuàng)建完數(shù)據(jù)庫,此表中還無任何數(shù)據(jù)):
sqlite>.schema sqlite_master
CREATE TABLE sqlite_master (
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
現(xiàn)在店诗,我們創(chuàng)建了SQLite數(shù)據(jù)庫裹刮,.databases
命令來檢查它是否在數(shù)據(jù)庫列表中,如下所示:
sqlite>.databases
seq name file
--- --------------- ----------------------------------------------------------
0 main /data/test/DBtest.db
sqlite>
我們能看到這是個列表庞瘸,就是說還會有其他數(shù)據(jù)庫在里面捧弃,其實SQLite還可以創(chuàng)建此庫的其他關(guān)聯(lián)庫,如:
導(dǎo)出數(shù)據(jù)庫:使用.dump
命令將數(shù)據(jù)庫完整的導(dǎo)出到一個文本文件中:
root@generic_x86_64:/data/test > sqlite3 testDB.db .dump > testDB.sql
root@generic_x86_64:/data/test > ls
DBtest.db
DBtest.sql
root@generic_x86_64:/data/test >
我們也可以從一個文件恢復(fù)一個數(shù)據(jù)庫:
sqlite3 testDB.db < testDB.sql
sqlite>
表示所處于數(shù)據(jù)庫中恕洲,如果想出去塔橡,可以使用.quit
或.exit
命令退出 sqlite 提示符
sqlite>.quit
3 SQLite語句
3.1 SQLite數(shù)據(jù)類型
在學(xué)習(xí)SQLite語句之前梅割,必須先要清楚每個存儲在 SQLite 數(shù)據(jù)庫中的值的類型:
存儲類 | 描述 |
---|---|
NULL | 值是一個 NULL 值霜第。 |
INTEGER | 值是一個帶符號的整數(shù)葛家,根據(jù)值的大小存儲在 1、2泌类、3癞谒、4、6 或 8 字節(jié)中刃榨。 |
REAL | 值是一個浮點值弹砚,存儲為 8 字節(jié)的 IEEE 浮點數(shù)字。 |
TEXT | 值是一個文本字符串枢希,使用數(shù)據(jù)庫編碼(UTF-8桌吃、UTF-16BE 或 UTF-16LE)存儲。 |
BLOB | 值是一個 blob 數(shù)據(jù)苞轿,完全根據(jù)它的輸入存儲茅诱。 |
注:SQLite 親和類型 我們暫時先不學(xué)習(xí)。
Boolean 數(shù)據(jù)類型
SQLite 沒有單獨的 Boolean 存儲類搬卒。相反瑟俭,布爾值被存儲為整數(shù) 0(false)和 1(true)。
Date 與 Time 數(shù)據(jù)類型
SQLite 沒有一個單獨的用于存儲日期和/或時間的存儲類契邀,但 SQLite 能夠把日期和時間存儲為 TEXT摆寄、REAL 或 INTEGER 值:
存儲類 | 日期格式 |
---|---|
TEXT | 格式為 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。 |
REAL | 從公元前 4714 年 11 月 24 日格林尼治時間的正午開始算起的天數(shù)坯门。 |
INTEGER | 從 1970-01-01 00:00:00 UTC 算起的秒數(shù)微饥。 |
我們可以通過上述任一格式來存儲日期和時間,并且可以使用內(nèi)置的日期和時間函數(shù)來自由轉(zhuǎn)換不同格式古戴。
3.2 SQLite語句
SQLite 是不區(qū)分大小寫的欠橘,但也有一些命令是大小寫敏感的,比如 GLOB 和 glob 就有不同的含義允瞧。
所有的 SQLite 語句可以以任何關(guān)鍵字開始简软,如SELECT
、INSERT
述暂、UPDATE
痹升、DELETE
、ALTER
畦韭、DROP
等疼蛾,必須以分號;
結(jié)束。
??注意艺配,由于sqlit>提示符下不支持Tab鍵察郁,不支持箭頭衍慎,要謹(jǐn)慎些,若漏掉;
分號就執(zhí)行了皮钠,會提示補(bǔ)齊命令:...>
在其后面繼續(xù)敲就好了
3.2.1 創(chuàng)建表
現(xiàn)在稳捆,讓我們創(chuàng)建一個表(COMPANY公司):
// COMPANY表,ID 作為主鍵(PRIMARY KEY)麦轰,NOT NULL約束表示在表中創(chuàng)建紀(jì)錄時這些字段不能為 NULL
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
// 復(fù)制進(jìn)去乔夯,末尾若出現(xiàn)...> 符號不要慌,按下Enter執(zhí)行就好
使用.tables
查看是否創(chuàng)建成功:
sqlite>.tables
COMPANY
可以使用.schema 表名
命令得到表的完整信息款侵,如下所示:
sqlite>.schema COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
刪除表也很簡單:
sqlite> DROP TABLE COMPANY;
3.2.2 添加數(shù)據(jù)
INSERT INTO
語句有兩種基本語法(下面的語句將在 COMPANY 表中創(chuàng)建六個記錄):
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
或:
INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
使用一個表來填充另一個表:
可以通過在一個有一組字段的表上使用 select 語句末荐,填充數(shù)據(jù)到另一個表中:
INSERT INTO first_table_name [(column1, column2, ... columnN)]
SELECT column1, column2, ...columnN
FROM second_table_name
[WHERE 查詢條件];
3.2.3 SELECT查詢
我們可以查詢一下表數(shù)據(jù) 如果沒有配置如下格式化設(shè)置,可以設(shè)置一下:
sqlite> .header on
sqlite> .mode column
sqlite> .timer on
sqlite> SELECT * FROM COMPANY;
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
Run Time: real 0.001 user 0.000000 sys 0.000000
格式化查詢必須在每個庫里面單獨配置
只想獲取 COMPANY 表中指定的字段新锈,則使用下面的查詢:
sqlite> SELECT ID, NAME, SALARY FROM COMPANY;
本文只介紹SQLite命令和簡單sql語句甲脏,有關(guān) 詳細(xì)SQL語句請點擊查看。
4. Android使用SQLite
有個Demo還沒做完妹笆,持續(xù)更新中块请,可供參考一個基于SQLite實現(xiàn)的待辦App