SQLite

以下內(nèi)容整理自互聯(lián)網(wǎng)摧冀,僅用于個(gè)人學(xué)習(xí)


1. Android保存數(shù)據(jù)

Android提供幾種保存數(shù)據(jù)的方式,保證程序在結(jié)束之后這些保存的數(shù)據(jù)不會(huì)丟失须肆。

  • 文本文件保存:可以保存在應(yīng)用程序自己的目錄下榆苞,安裝的每個(gè)app都會(huì)在/data/data/目錄下創(chuàng)建個(gè)文件夾,名字和應(yīng)用程序中AndroidManifest.xml文件中的package一樣瘟忱。
  • SD卡保存
  • Preferences保存:這也是一種經(jīng)常使用的數(shù)據(jù)存儲(chǔ)方法,因?yàn)樗鼈儗?duì)于用戶而言是透明的苫幢,并且從應(yīng)用安裝的時(shí)候就存在了访诱。
  • Assets保存:用來存儲(chǔ)一些只讀數(shù)據(jù),Assets是指那些在assets目錄下的文件韩肝,這些文件在你將你的應(yīng)用編譯打包之前就要存在触菜,并且可以在應(yīng)用程序運(yùn)行的時(shí)候被訪問到。

但有時(shí)候我們需要對(duì)保存的數(shù)據(jù)進(jìn)行一些復(fù)雜的操作哀峻,或者數(shù)據(jù)量很大涡相,超出了文本文件和Preference的性能能的范圍,所以需要一些更加高效的方法來管理剩蟀,從Android1.5開始催蝗,Android就自帶SQLite數(shù)據(jù)庫了。

SQLite它是一個(gè)獨(dú)立的育特,無需服務(wù)進(jìn)程丙号,支持事務(wù)處理,可以使用SQL語言的數(shù)據(jù)庫且预。

2. SQLite特性

  • ACID事務(wù) :指數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個(gè)基本要素的縮寫槽袄。包含:原子性(Atomicity)、一致性(Consistency)锋谐、隔離性(Isolation)、持久性(Durability)截酷。一個(gè)支持事務(wù)(Transaction)的數(shù)據(jù)庫涮拗,必需要具有這四種特性,否則在事務(wù)過程(Transaction processing)當(dāng)中無法保證數(shù)據(jù)的正確性迂苛,交易過程極可能達(dá)不到交易方的要求三热。
  • 無需安裝和管理配置
  • 支持多種開發(fā)語言,C三幻,PHP就漾,Perl,Java念搬,ASP.NET抑堡,Python
  • 儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫
  • 數(shù)據(jù)庫文件可以在不同字節(jié)順序的機(jī)器間自由的共享
  • 支持?jǐn)?shù)據(jù)庫大小至2TB
  • 在普通數(shù)據(jù)庫操作方面比一些流行的數(shù)據(jù)庫要快
  • 簡(jiǎn)單, 輕松的API
  • 包含TCL綁定, 同時(shí)通過Wrapper支持其他語言的綁定
  • 良好注釋的源代碼, 并且有著90%以上的測(cè)試覆蓋率
  • 獨(dú)立: 沒有額外依賴

3. Android中使用SQLite

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

Android 不自動(dòng)提供數(shù)據(jù)庫摆出。在 Android 應(yīng)用程序中使用 SQLite,必須自己創(chuàng)建數(shù)據(jù)庫首妖,然后創(chuàng)建表偎漫、索引,填充數(shù)據(jù)有缆。Android 提供了 SQLiteOpenHelper 幫助你創(chuàng)建一個(gè)數(shù)據(jù)庫象踊,你只要繼承 SQLiteOpenHelper 類根據(jù)開發(fā)應(yīng)用程序的需要,封裝創(chuàng)建和更新數(shù)據(jù)庫使用的邏輯就行了棚壁。

SQLiteOpenHelper是一個(gè)抽象類杯矩,在這個(gè)類里有兩個(gè)抽象方法,OnCreate和OnUpgrade袖外,前者用于第一次創(chuàng)建數(shù)據(jù)庫史隆,后者用于數(shù)據(jù)庫升級(jí)。

publicclassDatabaseHelperextendsSQLiteOpenHelper{

/**
*@paramcontext上下文環(huán)境(例如在刺,一個(gè)Activity)
*@paramname數(shù)據(jù)庫名字
*@paramfactory一個(gè)可選的游標(biāo)工廠(通常是Null)
*@paramversion數(shù)據(jù)庫模型版本的整數(shù)
*
*會(huì)調(diào)用父類SQLiteOpenHelper的構(gòu)造函數(shù)
*/
publicDatabaseHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){
super(context,name,factory,version);

}

/**
*在數(shù)據(jù)庫第一次創(chuàng)建的時(shí)候會(huì)調(diào)用這個(gè)方法
*
*根據(jù)需要對(duì)傳入的SQLiteDatabase對(duì)象填充表和初始化數(shù)據(jù)逆害。
*/
@Override
publicvoidonCreate(SQLiteDatabasedb){

}

/**
*當(dāng)數(shù)據(jù)庫需要修改的時(shí)候(兩個(gè)數(shù)據(jù)庫版本不同),Android系統(tǒng)會(huì)主動(dòng)的調(diào)用這個(gè)方法蚣驼。
*一般我們?cè)谶@個(gè)方法里邊刪除數(shù)據(jù)庫表魄幕,并建立新的數(shù)據(jù)庫表.
*/
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//三個(gè)參數(shù),一個(gè)SQLiteDatabase對(duì)象颖杏,一個(gè)舊的版本號(hào)和一個(gè)新的版本號(hào)

}

@Override
publicvoidonOpen(SQLiteDatabasedb){
//每次成功打開數(shù)據(jù)庫后首先被執(zhí)行
super.onOpen(db);
}
}

當(dāng)Android應(yīng)用運(yùn)行時(shí)纯陨,SQLiteOpenHelper會(huì)先檢查是否已經(jīng)存在數(shù)據(jù)庫,如果不存在留储,就創(chuàng)建數(shù)據(jù)庫翼抠,然后打開數(shù)據(jù)庫,最后調(diào)用OnCreate方法获讳;如果數(shù)據(jù)庫已存在阴颖,而版本號(hào)比上次創(chuàng)建的數(shù)據(jù)庫版本號(hào)高,就調(diào)用OnUpgrade丐膝,用于升級(jí)量愧。

繼承SQLiteOpenHelper之后就擁有了以下兩個(gè)方法:

  • getReadableDatabase()  創(chuàng)建或者打開一個(gè)查詢數(shù)據(jù)庫
  • getWritableDatabase() 創(chuàng)建或者打開一個(gè)可寫數(shù)據(jù)庫
DatabaseHelperdatabase=newDatabaseHelper(context);//傳入一個(gè)上下文參數(shù)
SQLiteDatabasedb=null;
db=database.getWritableDatabase();

上面這段代碼會(huì)返回一個(gè) SQLiteDatabase 類的實(shí)例,使用這個(gè)對(duì)象帅矗,你就可以查詢或者修改數(shù)據(jù)庫偎肃。

3.2 創(chuàng)建表和索引

創(chuàng)建表和索引,需要調(diào)用 SQLiteDatabase 的 execSQL() 方法來執(zhí)行 DDL 語句浑此。如:

db.execSQL("CREATETABLEuser(_idINTEGERPRIMARYKEY
AUTOINCREMENT,usernameTEXT,passwordTEXT);");

要?jiǎng)h除表和索引累颂,需要使用 execSQL() 方法調(diào)用 DROP INDEX 和 DROP TABLE 語句。

3.3添加數(shù)據(jù)

Android中SQLite數(shù)據(jù)操作(添加凛俱、刪除紊馏、更新)方式都有兩種料饥,第一種是使用execSQL() 方法執(zhí)行 INSERT, UPDATE, DELETE 等語句,第二種是使用SQLiteDatabase 對(duì)象的 insert()瘦棋、update()稀火、delete()等方法。

3.3.1 使用execSQL() 添加數(shù)據(jù)

execSQL() 方法適用于所有不返回結(jié)果的 SQL 語句赌朋。

Stringsql="insertintouser(username,password)values('afsds','123456');//插入操作的SQL語句
db.execSQL(sql);//執(zhí)行SQL語句

3.3.2 使用 SQLiteDatabase 對(duì)象的 insert()

ContentValuesvalue=newContentValues();
value .put("username","finch");//添加用戶名
value .put("password","123456");//添加密碼
db.insert("user",null,value );//執(zhí)行插入操作

3.4 更新數(shù)據(jù)

3.4.1 使用execSQL方式的實(shí)現(xiàn)

Stringsql="update[user]setpassword='654321'whereusername="finch";//修改的SQL語句
db.execSQL(sql);//執(zhí)行修改

3.4.2 使用SQLiteDatabase 對(duì)象的 update()方法

ContentValuesvalue=newContentValues();
value.put("password","654321");//添加要更改的字段及內(nèi)容
StringwhereClause="username=?";//修改條件
String[]whereArgs={"finch"};//修改條件的參數(shù)
db.update("user",value,whereClause,whereArgs);//執(zhí)行修改

該方法有四個(gè)參數(shù):表名凰狞;列名和值的 ContentValues 對(duì)象;可選的 WHERE 條件沛慢;可選的填充 WHERE 語句的字符串赡若,這些字符串會(huì)替換 WHERE 條件中的“?”標(biāo)記团甲,update() 根據(jù)條件逾冬,更新指定列的值。

3.5 刪除數(shù)據(jù)

3.5.1 使用execSQL方式的實(shí)現(xiàn)

Stringsql="deletefromuserwhereusername="finch";//刪除操作的SQL語句
db.execSQL(sql);//執(zhí)行刪除操作

3.5.2 使用SQLiteDatabase 對(duì)象的delete()方法

StringwhereClause="username=?";//刪除的條件
String[]whereArgs={"finch"};//刪除的條件參數(shù)
db.delete("user",whereClause,whereArgs);//執(zhí)行刪除

3.6 查詢數(shù)據(jù)

查詢數(shù)據(jù)不同于添加躺苦、刪除身腻、更新。主要有以下幾種方式匹厘。

3.6.1 通過query實(shí)現(xiàn)查詢

query() 方法用 SELECT 語句段構(gòu)建查詢嘀趟。SELECT 語句內(nèi)容作為 query() 方法的參數(shù),比如:要查詢的表名愈诚,要獲取的字段名她按,WHERE 條件,包含可選的位置參數(shù)炕柔,去替代 WHERE 條件中位置參數(shù)的值酌泰,GROUP BY 條件,HAVING 條件匕累。除了表名陵刹,其他參數(shù)可以是 null。

Cursorc=db.query("user",null,null,null,null,null,null);//查詢并獲得游標(biāo)
if(c.moveToFirst()){//判斷游標(biāo)是否為空
for(inti=0;i<c.getCount();i++){ 
      c.move(i);//移動(dòng)到指定記錄
      Stringusername=c.getString(c.getColumnIndex("username");
      Stringpassword=c.getString(c.getColumnIndex("password"));
}
}

3.6.2 使用 rawQuery() 直接調(diào)用 SELECT 語句

Cursorc=db.rawQuery("select*fromuserwhereusername=?",newStirng[]{"finch"});

if(c.moveToFirst()){
Stringpassword=c.getString(c.getColumnIndex("password"));
}

返回值是一個(gè) cursor 對(duì)象欢嘿,這個(gè)對(duì)象的方法可以迭代查詢結(jié)果授霸。 如果查詢是動(dòng)態(tài)的,使用這個(gè)方法就會(huì)非常復(fù)雜际插。例如,當(dāng)你需要查詢的列在程序編譯的時(shí)候不能確定显设,這時(shí)候使用 query() 方法會(huì)方便很多框弛。

3.6.3 使用游標(biāo)

不管你如何執(zhí)行查詢,都會(huì)返回一個(gè) Cursor捕捂,這是 Android 的 SQLite 數(shù)據(jù)庫游標(biāo)瑟枫。

  • 通過使用 getCount() 方法得到結(jié)果集中有多少記錄斗搞;
  • 通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
  • 通過 getColumnNames() 得到字段名慷妙;
  • 通過 getColumnIndex() 轉(zhuǎn)換成字段號(hào)僻焚;
  • 通過 getString(),getInt() 等方法得到給定字段當(dāng)前記錄的值膝擂;
  • 通過 requery() 方法重新執(zhí)行查詢得到游標(biāo)虑啤;
  • 通過 close() 方法釋放游標(biāo)資源;

下面給出一個(gè)遍歷的示例

Cursorresult = db.rawQuery("SELECT_id,username,passwordFROMuser");
result.moveToFirst();
while(!result.isAfterLast()){
intid=result.getInt(0);
Stringname=result.getString(1);
Stringpassword=result.getString(2);
//dosomethingusefulwiththese
result.moveToNext();
 }
result.close();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末架馋,一起剝皮案震驚了整個(gè)濱河市狞山,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叉寂,老刑警劉巖萍启,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屏鳍,居然都是意外死亡勘纯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門钓瞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驳遵,“玉大人,你說我怎么就攤上這事降淮〕瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵佳鳖,是天一觀的道長(zhǎng)霍殴。 經(jīng)常有香客問我,道長(zhǎng)系吩,這世上最難降的妖魔是什么来庭? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮穿挨,結(jié)果婚禮上月弛,老公的妹妹穿的比我還像新娘。我一直安慰自己科盛,他們只是感情好帽衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贞绵,像睡著了一般厉萝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天谴垫,我揣著相機(jī)與錄音章母,去河邊找鬼。 笑死翩剪,一個(gè)胖子當(dāng)著我的面吹牛乳怎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播前弯,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚪缀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了博杖?” 一聲冷哼從身側(cè)響起椿胯,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剃根,沒想到半個(gè)月后哩盲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年廉油,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苗傅。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抒线,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渣慕,到底是詐尸還是另有隱情嘶炭,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布逊桦,位于F島的核電站眨猎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏强经。R本人自食惡果不足惜睡陪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匿情。 院中可真熱鬧兰迫,春花似錦、人聲如沸炬称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玲躯。三九已至须鼎,卻和暖如春鲸伴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晋控。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姓赤,地道東北人赡译。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像不铆,于是被迫代替她去往敵國(guó)和親蝌焚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • 一.SQLite的介紹1.SQLite簡(jiǎn)介SQLite是一款輕型的數(shù)據(jù)庫誓斥,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)只洒,它...
    AiPuff閱讀 621評(píng)論 0 3
  • SQLite數(shù)據(jù)庫,和其他的SQL數(shù)據(jù)庫不同劳坑, 我們并不需要在手機(jī)上另外安裝一個(gè)數(shù)據(jù)庫軟件毕谴,Android系統(tǒng)已經(jīng)...
    JuSong閱讀 1,932評(píng)論 0 3
  • html轉(zhuǎn)為NSAttributedString NSAttributedString 轉(zhuǎn)為 html(作為NSA...
    SSBun閱讀 3,255評(píng)論 1 4
  • 三國(guó)亂世之中似乎只有橫掃千軍的勇武和十步殺一人的謀略才被奉為行天下無阻的王道,大多數(shù)的歌功頌德不過是孱弱文人們迫于...
    聞心ol閱讀 452評(píng)論 0 5