了解SQLite數(shù)據(jù)庫

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)鍵字開始简软,如SELECTINSERT述暂、UPDATE痹升、DELETEALTER畦韭、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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晾浴,隨后出現(xiàn)的幾起案子负乡,更是在濱河造成了極大的恐慌,老刑警劉巖脊凰,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抖棘,死亡現(xiàn)場離奇詭異,居然都是意外死亡狸涌,警方通過查閱死者的電腦和手機(jī)切省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帕胆,“玉大人朝捆,你說我怎么就攤上這事±帘” “怎么了芙盘?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脸秽。 經(jīng)常有香客問我儒老,道長,這世上最難降的妖魔是什么记餐? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任驮樊,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚衔。我一直安慰自己挖腰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布练湿。 她就那樣靜靜地躺著猴仑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞠鲜。 梳的紋絲不亂的頭發(fā)上宁脊,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天断国,我揣著相機(jī)與錄音贤姆,去河邊找鬼。 笑死稳衬,一個胖子當(dāng)著我的面吹牛霞捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薄疚,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碧信,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了街夭?” 一聲冷哼從身側(cè)響起砰碴,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎板丽,沒想到半個月后呈枉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡埃碱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年猖辫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砚殿。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡啃憎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出似炎,到底是詐尸還是另有隱情辛萍,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布羡藐,位于F島的核電站贩毕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏传睹。R本人自食惡果不足惜耳幢,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睛藻,春花似錦启上、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至按摘,卻和暖如春包券,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炫贤。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工溅固, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兰珍。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓侍郭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掠河。 傳聞我的和親對象是個殘疾皇子亮元,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容