SQLite資料庫學習筆記

2021-09-30 12:41:42 字數 3645 閱讀 8496

android開發中可能會用到資料庫,這裡我打算說些資料庫較少用到但是也很重要的一些知識

1:建立資料庫,建立表,刪除表,修改表,基於表的增,刪,改,查等操作由於用得比較多,就掠過了(android開發基本都知道)

下面的內容均以 一張員工表(employee)作為示例,員工表的結構為:employee(id,name,salary,empdate,departmentid)

2:sqlite的索引

create index 索引名 on 表名(列名,列名.......)

create index index_employee on employee(departmentid,salary) 建立了乙個按照 員工的部門 和 薪水 排列的索引

建立索引的命令其實較簡單,一看便知,但是有一點還是需要說下:儘管你建立了索引但是還是會發現索引失效了,沒什麼用,跟沒建立索引時沒啥差別(特別是你建立的索引中包含的列很多時),其實這跟前導列有關,

所謂前導列,就是在建立復合索引語句的第一列或者連續的多列。比如通過:create index comp_ind on table1(x, y, z)建立索引,那麼x,xy,xyz都是前導列,而yz,y,z這樣的就不是。下面講的這些,對於其他資料庫或許會有一些小的差別,這裡以sqlite為標準。在where子句中,前導列必須使用等於或者in操作,最右邊的列可以使用不等式,這樣索引才可以完全生效。同時,where子句中的列不需要全建立了索引,但是必須保證建立索引的列之間沒有間隙。舉幾個例子來看吧:

用如下語句建立索引:

create index idx_ex1 on ex1(a,b,c,d,e,...,y,z);

這裡是乙個查詢語句:

...where a=5 and b in (1,2,3) and c is null and d='hello'

這顯然對於abcd四列都是有效的,因為只有等於和in操作,並且是前導列。

再看乙個查詢語句:

... where a=5 and b in (1,2,3) and c>12 and d='hello'

那這裡只有a,b和c的索引會是有效的,d列的索引會失效,因為它在c列的右邊,而c列使用了不等式,根據使用不等式的限制,c列已經屬於最右邊。

最後再看一條:

... where b in (1,2,3) and c not null and d='hello'

索引將不會被使用,因為沒有使用前導列,這個查詢會是乙個全表查詢。

3)對於between,or,like,都無法使用索引。

如 ...where myfield between 10 and 20;

這時就應該將其轉換成:

...where myfield >= 10 and myfield <= 20;

再如like:...mytable where myfield like 'sql%';;

此時應該將它轉換成:

...where myfield >= 'sql' and myfield < 'sqm';

再如or:...where myfield = 'abc' or myfield = 'xyz';

此時應該將它轉換成:

...where myfield in ('abc', 'xyz');

3:sqlite的檢視

檢視使用起來也比較簡單,把它當作表來使用即可

建立普通的檢視:create view v_employee as select * from employee where salary > 10000

建立臨時的檢視:create temp view v_employee as select * from employee where salary > 10000

刪除檢視:drop view if exists v_employee 

4:sqlite的事物

注意:android中每條sql語句都是自動提交的

begin

delete from employee where id= 100;

rollback

delete from employee where id= 200;

commit

select * from employee where id in (100,200);

大家可以去掉rollback語句,再次執行sql比較下兩次的結果

5:sqlite的觸發器

引入兩張新錶(userok和userbak表)

1.刪除

create  trigger main.[userok_deleteok] after delete on [userok] for each row

begin

delete from userbak where uid=old.uid ;

end;

當刪除新錶中的一條記錄時 同時也刪除備份表中同id的資料

2.更新

create  trigger main.[userok_update] after update on [userok] for each row

begin

update userbak set username=new.username   where userbak.uid=old.uid ;

end;

更新使用者表時 ,同時更新使用者備份表

6:sqlite的鎖

sqlite採用粗放型的鎖。當乙個連線要寫資料庫,所有其它的連線被鎖住,直到寫連線結束了它的事務。sqlite有乙個加鎖表,來幫助不同的寫資料庫都能夠在最後一刻再加鎖,以保證最大的併發性。 sqlite使用鎖逐步上公升機制,為了寫資料庫,連線需要逐級地獲得排它鎖。

sqlite有5個不同的鎖狀態:未加鎖(unlocked)、共享 (shared)、保留(reserved)、未決(pending)和排它(exclusive)。每個資料庫連線在同一時刻只能處於其中乙個狀態。每 種狀態(未加鎖狀態除外)都有一種鎖與之對應。 

最初的狀態是未加鎖狀態,在此狀態下,連線還沒有訪問資料庫。當連線到了乙個資料庫,甚至已經用begin開始了乙個事務時,連線都還處於未加鎖狀態。 

未加鎖狀態的下乙個狀態是共享狀態。為了能夠從資料庫中讀(不寫)資料,連線必須首先進入共享狀態,也就是說首先要獲得乙個共享鎖。多個連線可以 同時獲得並保持共享鎖,也就是說多個連線可以同時從同乙個資料庫中讀資料。但哪怕只有乙個共享鎖還沒有釋放,也不允許任何連線寫資料庫。 

如果乙個連線想要寫資料庫,它必須首先獲得乙個保留鎖。乙個資料庫上同時只能有乙個保留鎖。保留鎖可以與共享鎖共存,保留鎖是寫資料庫的第1階段。保留鎖即不阻止其它擁有共享鎖的連線繼續讀資料庫,也不阻止其它連線獲得新的共享鎖。 

一旦乙個連線獲得了保留鎖,它就可以開始處理資料庫修改操作了,儘管這些修改只能在緩衝區中進行,而不是實際地寫到磁碟。對讀出內容所做的修改儲存在記憶體緩衝區中。 

當連線想要提交修改(或事務)時,需要將保留鎖提公升為排它鎖。為了得到排它鎖,還必須首先將保留鎖提公升為未決鎖。獲得未決鎖之後,其它連線就不能 再獲得新的共享鎖了,但已經擁有共享鎖的連線仍然可以繼續正常讀資料庫。此時,擁有未決鎖的連線等待其它擁有共享鎖的連線完成工作並釋放其共享鎖。 

一旦所有其它共享鎖都被釋放,擁有未決鎖的連線就可以將其鎖提公升至排它鎖,此時就可以自由地對資料庫進行修改了。所有以前對緩衝區所做的修改都會被寫到資料庫檔案。

Android學習筆記 SQLite資料庫儲存

因為前面提到xml儲存更改檔案很麻煩的緣故,最終還是選擇了使用資料庫儲存 一試才覺十分的方便,速度也快 上原始碼 public class dbhelper extends sqliteopenhelper override public void oncreate sqlitedatabase d...

Python學習筆記 SQLite資料庫使用

在使用sqlite前,我們先要搞清楚幾個概念 1 表是資料庫中存放關係資料的集合,乙個資料庫裡面通常都包含多個表,表和表之間通過外來鍵關聯。2 要操作關聯式資料庫,首先需要連線到資料庫,乙個資料庫連線稱為connection 3 連線到資料庫後,需要開啟游標,稱之為cursor,游標提供了一種對從表...

iOS學習筆記 資料庫操作 SQLite

sqlite 是乙個輕量級的關聯式資料庫。sqlite最初的設計目標是用於嵌入式系統,它占用資源非常少,在嵌入式裝置中,只需要幾百k的記憶體就夠了,目前應用於android ios windows phone等智慧型手機。ios 使用時sqlite,只需要加入 libsqlite3.dylib 依賴...