SQLite相關(guān)總結(jié)

最近由于sqlite數(shù)據(jù)庫操作不當出了一些問題凛俱,主要是由于升級導致的,具體原因不說了薄腻,總結(jié)一下在這次修復過程中總結(jié)的sqlite相關(guān)的知識點岛马。

1棉姐、版本號


SQLiteDatabase#getVersion方法,since API 1

getVersion其實是執(zhí)行了一句命令PRAGMA user_version命令啦逆。
將一個sqlite數(shù)據(jù)庫拖到SQLite Expert Personal打開伞矩,首先看到的是關(guān)于該數(shù)據(jù)庫的一系列基本狀態(tài):

sqlite.png

在SQL中執(zhí)行PRAGMA user_version命令可以拿到user_version值

PRAGMA user_version.png

PRAGMA是一個特殊的命令,可以在SQLite環(huán)境中控制(讀寫)各種環(huán)境變量和狀態(tài)標志夏志,語法:

PRAGMA pragma_name;
PRAGMA pragma_name = value;

2乃坤、當前數(shù)據(jù)庫版本與SQLiteOpenHelper打開的版本不同會發(fā)生什么?


如果發(fā)現(xiàn)希望打開的數(shù)據(jù)庫版本比現(xiàn)有的數(shù)據(jù)庫版本高,則會先進行數(shù)據(jù)庫升級操作湿诊;反之則進行降級操作狱杰。

3、數(shù)據(jù)庫升級降級在Android3.0之后的改變


在Android 3.0(API 11)之前厅须,如果版本號有改變浦旱,無論是升級降級,均回調(diào)onUpgrade方法九杂;
而從Android3.0開始及以后版本,區(qū)分升級和降級宣蠕;其中例隆,onDowngrade方法也是在Android3.0之后才有的,如果是降級抢蚀,則必須復寫該方法镀层,否則將會拋出SQLiteException異常。

Android 2.2.3源碼 SQLiteOpenHelper.java

public synchronized SQLiteDatabase getWritableDatabase() {
    ...
    try {
        ...
         int version = db.getVersion();
         if (version != mNewVersion) {
             db.beginTransaction();
             try {
                 if (version == 0) {
                     onCreate(db);
                 } else {
                     onUpgrade(db, version, mNewVersion);
                 }
                 db.setVersion(mNewVersion);
                 db.setTransactionSuccessful();
             } finally {
                 db.endTransaction();
             }
         }
      ...
}

Android 5.1.1源碼 SQLiteOpenHelper.java

private SQLiteDatabase getDatabaseLocked(boolean writable) {
    ....
        final int version = db.getVersion();
        if (version != mNewVersion) {
            if (db.isReadOnly()) {
                throw new SQLiteException("Can't upgrade read-only database from version " +
                        db.getVersion() + " to " + mNewVersion + ": " + mName);
            }

            db.beginTransaction();
            try {
                if (version == 0) {
                    onCreate(db);
                } else {
                    if (version > mNewVersion) {
                        onDowngrade(db, version, mNewVersion);
                    } else {
                        onUpgrade(db, version, mNewVersion);
                    }
                }
                ...
        }

        onOpen(db);
        ...
}

4皿曲、遍歷數(shù)據(jù)庫中的表


Cursor cursor = db.rawQuery("select name from sqlite_master where type='table';", null);
while(cursor.moveToNext()){
    //遍歷出表名
    String name = cursor.getString(0);
    Log.i("System.out", name);
}

SQLite數(shù)據(jù)庫中一個特殊的名叫 SQLITE_MASTER 上執(zhí)行一個SELECT查詢以獲得所有表的索引唱逢。每一個 SQLite 數(shù)據(jù)庫都有一個叫 SQLITE_MASTER 的表, 它定義數(shù)據(jù)庫的模式屋休。 SQLITE_MASTER 表看起來如下:

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);

對于表來說坞古,type 字段永遠是 ‘table’,name 字段永遠是表的名字劫樟。所以痪枫,要獲得數(shù)據(jù)庫中所有表的列表, 使用下列SELECT語句:
SELECT name FROM sqlite_master
WHERE type=’table’
ORDER BY name;
對于索引叠艳,type 等于 ‘index’, name 則是索引的名字奶陈,tbl_name 是該索引所屬的表的名字。 不管是表還是索引附较,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 語句創(chuàng)建它們時的命令文本。對于自動創(chuàng)建的索引(用來實現(xiàn) PRIMARY KEY 或 UNIQUE 約束),sql字段為NULL逾滥。
SQLITE_MASTER 表是只讀的羡儿。不能對它使用 UPDATE、INSERT 或 DELETE捕发。 它會被 CREATE TABLE疏旨、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動更新扎酷。
臨時表不會出現(xiàn)在 SQLITE_MASTER 表中檐涝。臨時表及其索引和觸發(fā)器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多, 但它只是對于創(chuàng)建那些臨時表的應(yīng)用可見谁榜。如果要獲得所有表的列表幅聘, 不管是永久的還是臨時的,可以使用類似下面的命令:

SELECT name FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type=’table’
ORDER BY name

sqlite_master.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窃植,一起剝皮案震驚了整個濱河市帝蒿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巷怜,老刑警劉巖葛超,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異延塑,居然都是意外死亡绣张,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門关带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侥涵,“玉大人,你說我怎么就攤上這事宋雏∥咂” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵磨总,是天一觀的道長嗦明。 經(jīng)常有香客問我,道長舍败,這世上最難降的妖魔是什么招狸? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮邻薯,結(jié)果婚禮上裙戏,老公的妹妹穿的比我還像新娘。我一直安慰自己厕诡,他們只是感情好累榜,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灵嫌,像睡著了一般壹罚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寿羞,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天猖凛,我揣著相機與錄音,去河邊找鬼绪穆。 笑死辨泳,一個胖子當著我的面吹牛虱岂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菠红,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼第岖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了试溯?” 一聲冷哼從身側(cè)響起蔑滓,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遇绞,沒想到半個月后键袱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摹闽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年杠纵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钩骇。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铝量,靈堂內(nèi)的尸體忽然破棺而出倘屹,到底是詐尸還是另有隱情,我是刑警寧澤慢叨,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布纽匙,位于F島的核電站,受9級特大地震影響拍谐,放射性物質(zhì)發(fā)生泄漏烛缔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一轩拨、第九天 我趴在偏房一處隱蔽的房頂上張望践瓷。 院中可真熱鬧,春花似錦亡蓉、人聲如沸晕翠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淋肾。三九已至,卻和暖如春爸邢,著一層夾襖步出監(jiān)牢的瞬間樊卓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工杠河, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碌尔,地道東北人浇辜。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像七扰,于是被迫代替她去往敵國和親奢赂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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