国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Android-Entwicklungshandbuch / 數(shù)據(jù)存儲與訪問之——又見SQLite數(shù)據(jù)庫

數(shù)據(jù)存儲與訪問之——又見SQLite數(shù)據(jù)庫

本節(jié)引言:

學習完上一節(jié),關(guān)于Android中的SQLite的基本操作,你就已經(jīng)掌握了,而在本節(jié)我們將會學習 一些稍微高級一點的東西,數(shù)據(jù)庫事務(wù),怎么將大二進制數(shù)據(jù)存儲到數(shù)據(jù)庫中,以及版本升級時 數(shù)據(jù)庫如何處理!好的,開始本節(jié)內(nèi)容!


SQLite事務(wù)

1.png

簡單點說就是:寫在事務(wù)里的所有數(shù)據(jù)庫操作都成功,事務(wù)提交,否則,事務(wù)回滾,就是回到前面 的狀態(tài)——未執(zhí)行數(shù)據(jù)庫操作的時候!另外,前面我們也將了,在data/data/<包名>/database/目錄 下除了有我們創(chuàng)建的db文件外,還有一個xxx.db-journal這個文件就是用來讓數(shù)據(jù)庫支持事務(wù)而 產(chǎn)生的 臨時的日志文件!


2.SQLite存儲大二進制文件

當然,一般我們很少往數(shù)據(jù)庫中存儲大二進制文件,比如圖片,音頻,視頻等,對于這些我們一般 是存儲文件路徑,但總會有些奇葩的需求,某天你突然想把這些文件存到數(shù)據(jù)庫里,下面我們以 圖片為例子,將圖片保存到SQLite中,以及讀取SQLite中的圖片!

2.png


3.SimpleCursorAdapter綁定數(shù)據(jù)庫數(shù)據(jù)

當然,這個玩玩可以,還是不建議使用,盡管用起來很簡單! 其實在講ContentProvider我們就使用過這個東西來綁定聯(lián)系人列表!這里就不寫實例了, 直接上核心代碼!需要的自己搗鼓搗鼓就好了,另外,現(xiàn)在我們一般很少自己寫數(shù)據(jù)庫的東西 ,一般是通過第三方的框架:ormlite,greenDao等,在進階部分,我們會再來學習~

3.png


4.數(shù)據(jù)庫升級的一些集錦

PS:好吧,這一塊我并沒有做過,始終是項目經(jīng)驗不夠,公司的產(chǎn)品都是定位類的,剛看過公司 項目,發(fā)現(xiàn)前人留下的代碼是:onCreate()創(chuàng)建DB,然后onUpgrade()把前面的DB刪掉,然后 再調(diào)用onCreate()方法!看了幾個版本的代碼,發(fā)現(xiàn)并沒有數(shù)據(jù)庫升級的操作...沒得借鑒, 只能參考下別人的做法了,下面是小豬查閱資料后的一些歸納,如果有什么不對,歡迎指出, 可能有些第三方的框架已經(jīng)弄好了這個,時間關(guān)系,就不慢慢去考究了!知道可以留言,謝謝!

1)什么是數(shù)據(jù)庫版本升級?怎么升級法?

答:假如我們開發(fā)了一款A(yù)PP,里面用到了數(shù)據(jù)庫,我們假定這個數(shù)據(jù)庫版本為v1.0, 在這個版本,我們創(chuàng)建了一個x.db的數(shù)據(jù)庫文件,我們通過onCreate()方法創(chuàng)建了第一個table, t_user,里面有兩個字段:_id,user_id;后面我們想增加一個字段user_name,這個時候 我們就需要對數(shù)據(jù)庫表的結(jié)構(gòu)進行修改了,而我們可以把更新數(shù)據(jù)庫的操作梵高onUpgrade() 方法中,我們只需要在實例化自定義SQLiteOpenHelper的時候,修改版本號,比如把1改成2 這樣,就會自動調(diào)用onUpgrade()的方法了!另外,對于每個數(shù)據(jù)庫版本我們都應(yīng)該做好 相應(yīng)的記錄(文檔),類似于下面這種:

數(shù)據(jù)庫版本andoid對應(yīng)版本內(nèi)容
v1.01第一個版本,包含兩個字段...
v1.12數(shù)據(jù)保留,新增user_name字段

2)一些疑問以及相關(guān)解決方案

①應(yīng)用升級,數(shù)據(jù)庫文件是否會刪除?

答:不會!數(shù)據(jù)什么的都在!

②如果我想刪除表中某個字段或者增加一個新的字段,原先的數(shù)據(jù)還在嗎?

答:在的!

③你剛說的那種粗暴的更新數(shù)據(jù)庫版本的方式,不保留數(shù)據(jù)的,可以貼下嗎?

答:可以,這里用的是第三方的ormlite,你也可以自己寫數(shù)據(jù)庫創(chuàng)建以及刪除的代碼:

4.png

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

答:很簡單,我們可以在onUpgrade()里寫一個switch(),結(jié)構(gòu)如下:

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(第三個版本的建表語句); 
    }
}
細心的你可能發(fā)現(xiàn)這里并沒有寫break,這就對了,這是為了保證跨版本升級時,每次數(shù)據(jù)庫 修改都能全部執(zhí)行到!這樣可以保證表結(jié)構(gòu)都是最新的!另外不一定是建表語句,修改表結(jié)構(gòu) 也可以哦!


⑤舊表的設(shè)計太糟糕,很多字段要改,改動太多,想建一個新表,但是表名要一樣而且以前的一些數(shù)據(jù)要保存到新表中!

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

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

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

3.導入數(shù)據(jù);INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User;    //原表中沒有的要自己設(shè)個默認值

4.刪除臨時表;DROP TABLE_temp_User;


本節(jié)小結(jié):

好的,本節(jié)我們對SQLite的事務(wù),大二進制存儲,SimpleCursorAdapter以及數(shù)據(jù)庫升級的 一些問題進行了探究,而關(guān)于SQLite的東西,我們暫時就學這么多,關(guān)于第三方的使用,以及 一些高深的話題,我們到進階的時候再和大家一起去研究~本節(jié)就到這里,謝謝~