以下內(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();