Android:SQLite數(shù)據(jù)存儲

  • 2016年12月8日,Google中國開發(fā)者大會在京舉行杜跷,同時正式上線了Google中國開發(fā)者網(wǎng)站Google Developers傍念,查看官方學(xué)習(xí)資源再也不用爬梯子了

SQLite數(shù)據(jù)庫的特點(diǎn)

SQLite,是一款輕量型的數(shù)據(jù)庫葛闷,是遵守ACID(原子性憋槐、一致性、隔離性淑趾、持久性)的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)秦陋,多用于嵌入式開發(fā)中。
Android平臺中嵌入了一個關(guān)系型數(shù)據(jù)庫SQLite治笨,和其他數(shù)據(jù)庫不同的是SQLite存儲數(shù)據(jù)時不區(qū)分類型,例如一個字段聲明為Integer類型赤嚼,我們也可以將一個字符串存入旷赖,一個字段聲明為布爾型,我們也可以存入浮點(diǎn)數(shù)更卒。
除非是主鍵被定義為Integer等孵,這時只能存儲64位整數(shù),SQLite蹂空,無需安裝俯萌,是Android平臺自帶的一個數(shù)據(jù)庫。

  • 創(chuàng)建數(shù)據(jù)庫的表時可以不指定數(shù)據(jù)類型上枕,例如:

    CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))
    
  • SQLite支持大部分標(biāo)準(zhǔn)SQL語句咐熙,增刪改查語句都是通用的,分頁查詢語句和MySQL相同

    SELECT * FROM person LIMIT 20 OFFSET 10
    SELECT * FROM person LIMIT 10,20
    
  • SQLite與MySql的不同之處
    主鍵自增長:SQLite是autoincrement辨萍,MySql是auto_increment
    主鍵:SQLite主鍵一般定義為_id棋恼,在做查詢時要求主鍵列名必須是_id(本身不是_id,可以起別名)锈玉,不然拿不到主鍵值爪飘。

  • 獲取可讀數(shù)據(jù)庫、可寫數(shù)據(jù)庫的區(qū)別
    可讀的數(shù)據(jù)庫也有可能可以寫拉背,可讀的數(shù)據(jù)庫在獲取實(shí)例時有可能拿到上一次可寫的數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫

  1. 定義類繼承SQLiteOpenHelper
  2. 聲明構(gòu)造函數(shù)师崎,4個參數(shù)
  3. 重寫onCreate()方法
  4. 重寫upGrade()方法
    public class PersonOpenHelper extends SQLiteOpenHelper {
        public PersonOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
                  }
                public void onCreate(SQLiteDatabase db) {
                // 數(shù)據(jù)庫第一次被創(chuàng)建的時候執(zhí)行如下sql語句創(chuàng)建一個person表
                db.execSQL("create table person(id integer primary key autoincrement, name varchar(20), phone varchar(20), money integer(20),age integer(10));");
                }
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // 數(shù)據(jù)庫的版本更新的時候執(zhí)行
                if (oldVersion == 1 && newVersion == 2) {
                    db.execSQL("alter table person add column balance integer");
                }
                }
   
      }

創(chuàng)建一個PersonOpenHelper類來測試上面的代碼

public class PersonOpenHelperTest extends AndroidTestCase {
public SQLiteDatabase getDataBase(){
    PersonOpenHelper helper = new PersonOpenHelper(getContext(), "person.db", null, 1);
    SQLiteDatabase writableDatabase = helper.getWritableDatabase();
    return writableDatabase;
    }
}

執(zhí)行完上面代碼后,通過DDMS椅棺,查看/data/data/com.包名.sqlite/databases目錄犁罩,發(fā)現(xiàn)產(chǎn)生了兩個文件齐蔽,person.db和person.db-journal。其中第一個文件就是我們的數(shù)據(jù)庫文件昼汗。

第一次操作數(shù)據(jù)庫時肴熏,person.db-journal文件會被自動創(chuàng)建,該文件是sqlite的一個臨時的日志文件顷窒,主要用于sqlite數(shù)據(jù)庫的事務(wù)回滾操作了蛙吏。 但是Android系統(tǒng)中將該文件永久的保存在磁盤中,不會被自動清除的鞋吉,如果沒有操作異逞蛔觯或者不需要事務(wù)回滾時,此文件的大小為0谓着。這種機(jī)制避免了每次生成和刪除person.db-journal文件的開銷泼诱。

在測試類中創(chuàng)建該類對象,調(diào)用getWritableDatabase()或者getReadableDatabase():如果數(shù)據(jù)庫不存在赊锚,創(chuàng)建數(shù)據(jù)庫文件治筒,執(zhí)行onCreate()方法,并獲取數(shù)據(jù)庫對象舷蒲。如果數(shù)據(jù)庫存在耸袜,版本號沒有發(fā)生改變盏求,直接獲取數(shù)據(jù)庫對象秉馏。如果數(shù)據(jù)庫存在,版本號提升靡挥,先執(zhí)行onUpgrade()方法纵柿,再獲取數(shù)據(jù)庫對象蜈抓。

數(shù)據(jù)庫并不是初始化MyHelper時創(chuàng)建。如果版本號降低昂儒,應(yīng)用降級沟使。并且不重寫onDowngrade,就會調(diào)用父類的onDowngrade方法渊跋,拋出異常格带。一般不重寫,沒這個需求刹枉。

SQLiteDataBase自帶的增刪改查

SQLiteDatabase專門提供了對應(yīng)于添加(insert)叽唱、刪除(delete)、更新(update)微宝、查詢(query)的操作方法棺亭。

這些方法封裝了部分SQL語句,通過參數(shù)進(jìn)行拼接蟋软,這些方法實(shí)際上是給那些不太了解SQL語法的開發(fā)者使用的镶摘。對于熟悉SQL語法的程序員而言嗽桩,直接使用execSQL()和rawQuery()方法執(zhí)行SQL語句就能完成數(shù)據(jù)的添加、刪除凄敢、更新碌冶、查詢操作。

這四個方法主要是在使用內(nèi)容提供者時使用涝缝,因?yàn)镃ontentProvider中提供的增刪改查方法扑庞,與這一套一樣,方便調(diào)用傳參拒逮。(等學(xué)完ContentProvider自然明白)

  • insert("表名",nullColumnHack,"",contentValue)
1. nullColumnHack:如果寫null罐氨,就無法插入一條空數(shù)據(jù)(2.3會出異常,4.0之后可以寫null)
2. 如果想插入空數(shù)據(jù)滩援,第二個參數(shù)必須寫一個列名(任意列)
3. 這個列名是用來拼接sql語句的,如果contentValue為空玩徊,則后臺不知道表的列名租悄,無法構(gòu)建sql語句
4. ContentValue:鍵值對:鍵對應(yīng)列明,值對應(yīng)插入的值
5. 返回值 long id恩袱,插入的主鍵id
  • delete("表名",條件,條件值)憎蛤,返回受影響的行數(shù)。
  1. update("表名",contentValues(更新列、值),條件冰肴,條件值),返回受影響的行數(shù)
  2. query("表名", 查詢的字段, 條件, 條件值);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熙尉,一起剝皮案震驚了整個濱河市检痰,隨后出現(xiàn)的幾起案子包归,更是在濱河造成了極大的恐慌,老刑警劉巖铅歼,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件公壤,死亡現(xiàn)場離奇詭異换可,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厦幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門沾鳄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人确憨,你說我怎么就攤上這事译荞。” “怎么了缚态?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵磁椒,是天一觀的道長。 經(jīng)常有香客問我玫芦,道長浆熔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任桥帆,我火速辦了婚禮医增,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘老虫。我一直安慰自己叶骨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布祈匙。 她就那樣靜靜地躺著忽刽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夺欲。 梳的紋絲不亂的頭發(fā)上跪帝,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音些阅,去河邊找鬼伞剑。 笑死,一個胖子當(dāng)著我的面吹牛市埋,可吹牛的內(nèi)容都是我干的黎泣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缤谎,長吁一口氣:“原來是場噩夢啊……” “哼抒倚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坷澡,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤衡便,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镣陕,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴餐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呆抑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岂嗓。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹊碍,靈堂內(nèi)的尸體忽然破棺而出厌殉,到底是詐尸還是另有隱情,我是刑警寧澤侈咕,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布公罕,位于F島的核電站,受9級特大地震影響耀销,放射性物質(zhì)發(fā)生泄漏楼眷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一熊尉、第九天 我趴在偏房一處隱蔽的房頂上張望罐柳。 院中可真熱鬧,春花似錦狰住、人聲如沸张吉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肮蛹。三九已至,卻和暖如春创南,著一層夾襖步出監(jiān)牢的瞬間伦忠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工扰藕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缓苛,地道東北人芳撒。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓邓深,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笔刹。 傳聞我的和親對象是個殘疾皇子芥备,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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