資料儲存與存取之-又見SQLite資料庫


本節引言:

學習完上一節,關於Android中的SQLite的基本操作,你就已經掌握了,而在本節我們將會學習 一些稍微高級一點的東西,資料庫事務,怎麼將大二進位資料儲存到資料庫中,以及版本升級時 資料庫如何處理!好的,開始本節內容!


SQLite交易

1.png

#簡單點說就是:寫在交易裡的所有資料庫操作都成功,交易提交,否則,事務回滾,就是回到前面 的狀態-未執行資料庫操作的時候!另外,前面我們也將了,在data/data/<套件名稱>/database/目錄 下除了有我們建立的db檔案外,還有一個xxx.db-journal這個檔案就是用來讓資料庫支援事務而 產生的 臨時的日誌檔!


2.SQLite儲存大二進位文件

當然,一般我們很少往資料庫中儲存大二進位文件,例如圖片,音頻,影片等,對於這些我們一般 是儲存檔案路徑,但總是會有些奇葩的需求,某天你突然想把這些檔案存到資料庫裡,下面我們以 圖片為例子,將圖片儲存到SQLite中,以及讀取SQLite中的圖片!

2.png


3.SimpleCursorAdapter綁定資料庫資料

當然,這個玩可以,還是不建議使用,儘管用起來很簡單! 其實在講ContentProvider我們就使用過這個東西來綁定聯絡人清單!這裡就不寫實例了, 直接上核心程式碼!需要的自己搗鼓搗鼓就好了,另外,現在我們通常很少自己寫資料庫的東西 ,一般是透過第三方的框架:ormlite,greenDao等,在進階部分,我們會再來學習~

3.png


4.資料庫升級的一些集錦

PS:好吧,這一塊我並沒有做過,始終是專案經驗不夠,公司的產品都是定位類的,剛看過公司 項目,發現前人留下的程式碼是:onCreate()建立DB,然後onUpgrade()把前面的DB刪掉,然後 再呼叫onCreate()方法!看了幾個版本的程式碼,發現並沒有資料庫升級的操作...沒得借鑑, 只能參考下別人的做法了,以下是小豬查閱資料後的一些歸納,如果有什麼不對,歡迎指出, 可能有些第三方的框架已經弄好了這個,時間關係,就不慢慢去考究了!知道可以留言,謝謝!

1)什麼是資料庫版本升級?怎麼升級法?

答:假如我們開發了一個APP,裡面用到了資料庫,我們假定這個資料庫版本為v1.0, 在這個版本,我們建立了一個x.db的資料庫文件,我們透過onCreate()方法建立了第一個table, t_user,裡面有兩個欄位:_id,user_id;後面我們想增加一個欄位user_name,這時候 我們就需要對資料庫表的結構進行修改了,而我們可以把更新資料庫的操作梵谷onUpgrade() 方法中,我們只需要在實例化自訂SQLiteOpenHelper的時候,修改版本號,例如把1改成2 這樣,就會自動呼叫onUpgrade()的方法了!另外,對於每個資料庫版本我們都應該做好 對應的記錄(文檔),類似於下面這種:

資料庫版本andoid對應版本#內容
v1.01#第一個版本,包含兩個欄位...
v1.12資料保留,新增user_name欄位

2)一些疑問以及相關解決方案

①應用升級,資料庫檔案是否會刪除?

答:不會!數據什麼的都在!

②如果我想刪除表中某個字段或增加一個新的字段,原先的資料還在嗎?

答:在的!

③你剛說的那種粗暴的更新資料庫版本的方式,不保留資料的,可以貼下來嗎?

答案:可以,這裡用的是第三方的ormlite,你也可以自己寫資料庫建立以及刪除的程式碼:

4.png

④例如是這種,假如我們已經升級到第三個版本了,我們在第二個版本增加了一個表,然後第三個版本也增加了一個表,加入用戶直接從第一個版本升級到第三個版本,這樣沒經過第二個版本,就沒有增加的那個表,這可怎麼破?

答:很簡單,我們可以在onUpgrade()裡寫一個switch(),結構如下:

public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
            int arg2, int arg3) {
    switch(arg2){
        case 1:
            db.execSQL(第一个版本的建表语句);
        case 2:
            db.execSQL(第二个版本的建表语句);
        case 3:
            db.execSQL(第三个版本的建表语句); 
    }
}
細心的你可能發現這裡並沒有寫break,這就對了,這是為了確保跨版本升級時,每次資料庫 修改都能全部執行到!這樣可以保證表結構都是最新的!另外不一定是建表語句,修改表結構 也可以哦!


⑤舊表的設計太糟糕,很多欄位要改,改動太多,想建立一個新表,但是表名要一樣而且以前的一些資料要儲存到新表中!

答:呵呵,給你跪了,當然,也有解決辦法,下面說下思路:

1.將舊表改名成臨時表: ALTER TABLE User RENAME TO _temp_User;

2.建立新表:CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));

3.導入資料;INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User;    //原表中沒有的要自行設個預設值

4.刪除臨時表;DROP TABLE_temp_User;


#本節小結:

#好的,本節我們對SQLite的事務,大二進制存儲,SimpleCursorAdapter以及資料庫升級的 有些問題進行了探究,而關於SQLite的東西,我們暫時就學這麼多,關於第三方的使用,以及 一些高深的話題,我們到進階的時候再跟大家一起去研究~本節就到這裡,謝謝~