Sqlite

前言

SQLite是一個(gè)輕量的屁倔、跨平臺(tái)的卵凑、開源的數(shù)據(jù)庫引擎奈嘿。SQLite每個(gè)數(shù)據(jù)庫都是以單個(gè)文件(.db)的形式存在貌虾,這些數(shù)據(jù)都是以B-Tree的數(shù)據(jù)結(jié)構(gòu)形式存儲(chǔ)在磁盤上。

使用SQLiteDatabase的insert裙犹,delete等方法或者execSQL方法默認(rèn)都開啟了事務(wù)尽狠,如果操作的順利完成才會(huì)更新.db數(shù)據(jù)庫衔憨。事務(wù)的實(shí)現(xiàn)是依賴于名為rollback journal文件,借助這個(gè)臨時(shí)文件來完成原子操作和回滾功能袄膏。

大家可以在/data/data/<packageName>/databases/目錄下看到一個(gè)和數(shù)據(jù)庫同名的.db-journal文件践图。

SQLite是文件級(jí)別的鎖:多個(gè)線程可以同時(shí)讀,但是同時(shí)只能有一個(gè)線程寫沉馆。Android提供了SqliteOpenHelper類码党,加入Java的鎖機(jī)制以便調(diào)用。


模板

public class DbOpenHelper extends SQLiteOpenHelper {
 private static final String DB_NAME = "book_provider.db";
 public static final String BOOK_TABLE_NAME = "book";
 public static final String USER_TALBE_NAME = "user";

 private static final int DB_VERSION = 3;

 private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "
         + BOOK_TABLE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT)";

 private String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS "
         + USER_TALBE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT," + "sex INT)";

 public DbOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); }

 @Override    
 public void onCreate(SQLiteDatabase db) {    //如果創(chuàng)建了斥黑,就不會(huì)回調(diào)這個(gè)方法揖盘。
     db.execSQL(CREATE_BOOK_TABLE);
     db.execSQL(CREATE_USER_TABLE);
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     // TODO ignored
 }
}

線程問題

SQLite的同步鎖精確到數(shù)據(jù)庫級(jí),粒度比較大锌奴,不像別的數(shù)據(jù)庫有表鎖兽狭,行鎖。同一個(gè)時(shí)間只允許一個(gè)連接進(jìn)行寫入操作鹿蜀。

如果多線程同時(shí)讀寫(這里的指不同的線程用使用的是不同的Helper實(shí)例)箕慧,后面的就會(huì)遇到android.database.sqlite.SQLiteException: database is locked這樣的異常。對(duì)于這樣的問題茴恰,解決的辦法就是keep single sqlite connection颠焦,保持單個(gè)SqliteOpenHelper實(shí)例,同時(shí)對(duì)所有數(shù)據(jù)庫操作的方法添加synchronized關(guān)鍵字往枣。

我們常常在多線程中只使用一個(gè)SQLiteDatabase引用蒸健,在用SQLiteDataBase.close()的時(shí)需要注意調(diào)是否還有別的線程在使用這個(gè)實(shí)例。如果一個(gè)線程操作完成后就直接close了婉商,別一個(gè)正在使用這個(gè)數(shù)據(jù)庫的線程就會(huì)異常似忧。所以有些人會(huì)直接把SQLiteDatabase的實(shí)例放在Application中,讓它們的生命周期一致丈秩。也有的做法是寫一個(gè)計(jì)數(shù)器盯捌,當(dāng)計(jì)數(shù)器為0時(shí)才真正關(guān)閉數(shù)據(jù)庫。


使用ORM的問題

目前網(wǎng)上有很多開源的ORM(對(duì)象關(guān)系數(shù)據(jù)映射)框架蘑秽,如greenDAO饺著、ormlite等等。在使用這些框架有必要很了解一下它們的利弊肠牲,特別是一些使用反射的框架幼衰,對(duì)性能的影響會(huì)比較大。有些框架在多線程同步方面也會(huì)產(chǎn)生一些問題缀雳,所以使用時(shí)要有所顧慮渡嚣。

Realm 是最近興起的一個(gè)專注于移動(dòng)設(shè)備數(shù)據(jù)庫的庫,其核心是使用C++編寫,號(hào)稱很多時(shí)候數(shù)據(jù)的存取速度比SQLite要快很多识椰。不過在我的一些項(xiàng)目中绝葡,發(fā)現(xiàn)它讀取并不比SQLite快。


參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腹鹉,一起剝皮案震驚了整個(gè)濱河市藏畅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌功咒,老刑警劉巖愉阎,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異力奋,居然都是意外死亡诫硕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門刊侯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锉走,你說我怎么就攤上這事滨彻。” “怎么了挪蹭?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵亭饵,是天一觀的道長。 經(jīng)常有香客問我梁厉,道長辜羊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任词顾,我火速辦了婚禮八秃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肉盹。我一直安慰自己昔驱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布上忍。 她就那樣靜靜地躺著骤肛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窍蓝。 梳的紋絲不亂的頭發(fā)上腋颠,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音吓笙,去河邊找鬼淑玫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的混移。 我是一名探鬼主播祠墅,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歌径!你這毒婦竟也來了毁嗦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤回铛,失蹤者是張志新(化名)和其女友劉穎狗准,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茵肃,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腔长,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了验残。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捞附。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖您没,靈堂內(nèi)的尸體忽然破棺而出鸟召,到底是詐尸還是另有隱情,我是刑警寧澤氨鹏,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布欧募,位于F島的核電站,受9級(jí)特大地震影響仆抵,放射性物質(zhì)發(fā)生泄漏跟继。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一镣丑、第九天 我趴在偏房一處隱蔽的房頂上張望舔糖。 院中可真熱鬧,春花似錦莺匠、人聲如沸剩盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辽聊。三九已至,卻和暖如春期贫,著一層夾襖步出監(jiān)牢的瞬間跟匆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工通砍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玛臂,地道東北人烤蜕。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像迹冤,于是被迫代替她去往敵國和親讽营。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • SQLiteOpenHelper getReadableDatabase()和getWritableDatabas...
    chandarlee閱讀 2,769評(píng)論 0 49
  • 一.SQLite的介紹1.SQLite簡介SQLite是一款輕型的數(shù)據(jù)庫泡徙,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)橱鹏,它...
    AiPuff閱讀 620評(píng)論 0 3
  • 鷺島廈門是個(gè)很美麗的海濱城市,給我的感覺很舒適和悠閑堪藐,據(jù)說政府對(duì)到那工作的高新技術(shù)人才第一年有10萬元的獎(jiǎng)勵(lì)莉兰,因?yàn)?..
    goeasyway閱讀 11,701評(píng)論 21 125
  • 追求快樂糖荒,期盼長壽,可以說是人之常情模捂。那么捶朵,如何才能做到既生活的快樂又能延年益壽呢?孔老夫子是這樣回答的:“知者樂...
    何江申閱讀 326評(píng)論 0 2
  • 十一月月來臨 芳菲散盡 四月凋零的花朵 你還孤單嗎 如果還來得及的話 我想化作十二月的雪 曾經(jīng)給予你的愛與恨 能否...
    YNiiiiii閱讀 215評(píng)論 0 4