個人相信我或注意微信號。類人猿是這樣來的。答復:學習,獲得免費學習資料包。
Android 提供了幾種方法用來保存數(shù)據(jù),使得這些數(shù)據(jù)即使在程序結束以后依然不會丟失。這些方法有:
- 文本文件:
- 可以保存在應用程序自己的目錄下,安裝的每個app都會在/data/data/目錄下創(chuàng)建個文件夾,名字和應用程序中AndroidMani文件中的package一樣。
- SDcard保存:
- Preferences保存:
- 這也是一種經(jīng)常使用的數(shù)據(jù)存儲方法,因為它們對于用戶而言是透明的,并且從應用安裝的時候就存在了。
- Assets保存:
- 用來存儲一些只讀數(shù)據(jù),Assets是指那些在assets目錄下的文件,這些文件在你將你的應用編譯打包之前就要存在,并且可以在應用程序運行的時候被訪問到。
但有時候我們需要對保存的數(shù)據(jù)進行一些復雜的操作,或者數(shù)據(jù)量很大,超出了文本文件和Preference的性能能的范圍,所以需要一些更加高效的方法來管理,從Android1.5開始,Android就自帶SQLite數(shù)據(jù)庫了,SQLite它是一個獨立的,無需服務進程,支持事務處理,可以使用sql語言的數(shù)據(jù)庫。
SQLite的特性
- ACID事務
- ACID:指數(shù)據(jù)庫事務正確執(zhí)行的四個基本要素的縮寫。包含:原子性(Atomicity,對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行,一套事務下來,如果有一個失敗,那整體失?。?、一致性(Consistency,事務是按照預期生效的)、隔離性(Isolation,一個事務的影響在該事務提交前對其他事務都不可見)、持久性(Durability,事務完成之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持)。
- 一個支持事務(Transaction)的數(shù)據(jù)庫,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數(shù)據(jù)的正確性,交易過程極可能達不到交易方的要求。
- 關于原子性和一致性很多同學搞不清楚區(qū)別,這里舉個栗子:
- 轉賬:張三給李四轉賬100元。那數(shù)據(jù)庫假設需要 張三扣100,李四加100,記錄一條流水。
- 如果流水沒記錄成功,那整體回滾,張三也沒轉賬成功,李四也沒多錢。這就是原子性的體現(xiàn)。
- 而張三必須扣100,李四必須加100,這個就是一致性了,如果因為某些邏輯原因,導致張三扣了100,流水記錄100轉賬,而李四只加了60。然后這3條操作都成功了,那原子性就符合了,但是一致性就不符合了~~~
- 零配置 – 無需安裝和管理配置
- 儲存在單一磁盤文件中的一個完整的數(shù)據(jù)庫
- 數(shù)據(jù)庫文件可以在不同字節(jié)順序的機器間自由的共享
- 支持數(shù)據(jù)庫大小至2TB
- 足夠小, 大致3萬行C代碼, 250K
- 比一些流行的數(shù)據(jù)庫在大部分普通數(shù)據(jù)庫操作要快
- 簡單, 輕松的API
- 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
- 良好注釋的源代碼, 并且有著90%以上的測試覆蓋率
- 獨立: 沒有額外依賴
- Source完全的Open, 你可以用于任何用途, 包括出售它
- 支持多種開發(fā)語言,C,PHP,Perl,Java,ASP.NET,Python
Android 中使用 SQLite
Activites 可以通過 Content Provider 或者 Service 訪問一個數(shù)據(jù)庫。
創(chuàng)建數(shù)據(jù)庫
Android 不自動提供數(shù)據(jù)庫。在 Android 應用程序中使用 SQLite,必須自己創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。Android 提供了 SQLiteOpenHelper 幫助你創(chuàng)建一個數(shù)據(jù)庫,你只要繼承 SQLiteOpenHelper 類根據(jù)開發(fā)應用程序的需要,封裝創(chuàng)建和更新數(shù)據(jù)庫使用的邏輯就行了?!?/p>
SQLiteOpenHelper 的子類,至少需要實現(xiàn)三個方法,注意看注釋:
public class DatabaseHelper extends SQLiteOpenHelper { /** * @param context 上下文環(huán)境(例如,一個 Activity) * @param name 數(shù)據(jù)庫名字 * @param factory 一個可選的游標工廠(通常是 Null) * @param version 數(shù)據(jù)庫模型版本的整數(shù) * * 會調用父類 SQLiteOpenHelper的構造函數(shù) */ public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 在數(shù)據(jù)庫第一次創(chuàng)建的時候會調用這個方法 * *根據(jù)需要對傳入的SQLiteDatabase 對象填充表和初始化數(shù)據(jù)。 */ @Override public void onCreate(SQLiteDatabase db) { } /** * 當數(shù)據(jù)庫需要修改的時候(兩個數(shù)據(jù)庫版本不同),Android系統(tǒng)會主動的調用這個方法。 * 一般我們在這個方法里邊刪除數(shù)據(jù)庫表,并建立新的數(shù)據(jù)庫表. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //三個參數(shù),一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號 } @Override public void onOpen(SQLiteDatabase db) { // 每次成功打開數(shù)據(jù)庫后首先被執(zhí)行 (db); }}繼承SQLiteOpenHelper之后就擁有了以下兩個方法:
- getReadableDatabase() 創(chuàng)建或者打開一個查詢數(shù)據(jù)庫
- getWritableDatabase() 創(chuàng)建或者打開一個可寫數(shù)據(jù)庫
上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,就可以查詢或者修改數(shù)據(jù)庫。
SQLiteDatabase類為我們提供了很多種方法,而較常用的方法如下:
- 刪除數(shù)據(jù)行:(int) delete(String table,String whereClause,String[] whereArgs)
- 添加數(shù)據(jù)行:(long) insert(String table,String nullColumnHack,ContentValues values)
- 更新數(shù)據(jù)行:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
- 執(zhí)行一個SQL語句,可以是一個select或其他的sql語句:(void) execSQL(String sql)
- 關閉數(shù)據(jù)庫:(void) close()
- 查詢指定的數(shù)據(jù)表返回一個帶游標的數(shù)據(jù)集:(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
各參數(shù)說明:
- table:表名稱
- colums:列名稱數(shù)組
- selection:條件子句,相當于where
- selectionArgs:條件語句的參數(shù)數(shù)組
- groupBy:分組
- having:分組條件
- orderBy:排序類
- limit:分頁查詢的限制
- Cursor:返回值,相當于結果集ResultSet
- 運行一個預置的SQL語句,返回帶游標的數(shù)據(jù)集(與上面的語句最大的區(qū)別就是防止SQL注入):(Cursor) rawQuery(String sql, String[] selectionArgs)
當你完成了對數(shù)據(jù)庫的操作(例如你的 Activity 已經(jīng)關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉數(shù)據(jù)庫連接。
創(chuàng)建表和索引
為了創(chuàng)建表和索引,需要調用 SQLiteDatabase 的 execSQL() 方法來執(zhí)行 DDL語句。如果沒有異常,這個方法沒有返回值。
例如,你可以執(zhí)行如下代碼:
db.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT);");這條語句會創(chuàng)建一個名為 user的表,表有一個列名為 _id,并且是主鍵,這列的值是會自動增長的整數(shù)。另外還有兩列:username( 字符 ) 和 password( 字符 )。SQLite 會自動為主鍵列創(chuàng)建索引。
通常情況下,第一次創(chuàng)建數(shù)據(jù)庫時創(chuàng)建了表和索引。要 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。
添加數(shù)據(jù)
有兩種方法可以給表添加數(shù)據(jù)。
①可以使用 execSQL() 方法執(zhí)行 INSERT, UPDATE, DELETE 等語句來更新表的數(shù)據(jù)。execSQL() 方法適用于所有不返回結果的 SQL 語句。例如:
String sql = "insert into user(username,password) values ('finch','123456');//插入操作的SQL語句 db.execSQL(sql);//執(zhí)行SQL語句②使用 SQLiteDatabase 對象的 insert()。
ContentValues cv = new ContentValues(); cv.put("username","finch");//添加用戶名 cv.put("password","123456"); //添加密碼 db.insert("user",null,cv);//執(zhí)行插入操作更新數(shù)據(jù)(修改)
①使用SQLiteDatabase 對象的 update()方法。
ContentValues cv = new ContentValues(); cv.put("password","654321");//添加要更改的字段及內容String whereClause = "username=?";//修改條件String[] whereArgs = {"finch"};//修改條件的參數(shù) db.update("user",cv,whereClause,whereArgs);//執(zhí)行修改該方法有四個參數(shù):
- 表名;
- 列名和值的 ContentValues 對象;
- 可選的 WHERE 條件;
- 可選的填充 WHERE 語句的字符串,這些字符串會替換 WHERE 條件中的“?”標記,update() 根據(jù)條件,更新指定列的值.
②使用execSQL方式的實現(xiàn)
String sql = "update [user] set password = '654321' where username="finch";//修改的SQL語句 db.execSQL(sql);//執(zhí)行修改刪除數(shù)據(jù)
①使用SQLiteDatabase 對象的delete()方法。
String whereClause = "username=?";//刪除的條件String[] whereArgs = {"finch"};//刪除的條件參數(shù) db.delete("user",whereClause,whereArgs);//執(zhí)行刪除②使用execSQL方式的實現(xiàn)
String sql = "delete from user where username="finch";//刪除操作的SQL語句 db.execSQL(sql);//執(zhí)行刪除操作查詢數(shù)據(jù)
①使用 rawQuery() 直接調用 SELECT 語句
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"finch"});i()) { String password = c.getString("password"));}返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。
如果查詢是動態(tài)的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用下面的 query() 方法會方便很多。
②通過query()實現(xiàn)查詢
query() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數(shù),比如:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數(shù),去替代 WHERE 條件中位置參數(shù)的值,GROUP BY 條件,HAVING 條件。除了表名,其他參數(shù)可以是 null。所以代碼可寫成:
Cursor c = db.query("user",null,null,null,null,null,null);//查詢并獲得游標i()){//判斷游標是否為空 for(int i=0;i<c.getCount();i++){ c.move(i);//移動到指定記錄String username = c.getString("username");String password = c.getString("password")); }}使用游標
不管你如何執(zhí)行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 數(shù)據(jù)庫游標,使用游標,你可以:
- 通過使用 getCount() 方法得到結果集中有多少記錄;
- 通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
- 通過 getColumnNames() 得到字段名;
- 通過 getColumnIndex() 轉換成字段號;
- 通過 getString(),getInt() 等方法得到給定字段當前記錄的值;
- 通過 requery() 方法重新執(zhí)行查詢得到游標;
- 通過 close() 方法釋放游標資源;
例如,下面代碼遍歷 user表:
Cursor result=db.rawQuery("SELECT _id, username, password FROM user"); re(); while (!re()) { int id=re(0); String name=re(1); String password =re(2); // do something useful with these re(); } re();以上就是sqlite的常用方法,點擊閱讀原文可跳轉至本文對應csdn博客地址,獲得更佳閱讀體驗。
來源網(wǎng)絡,侵權聯(lián)系刪除
私信我或關注微信號:猿來如此呀,回復:學習,獲取免費學習資源包。
1.《怎么用apk修改軟件數(shù)據(jù)庫?總結很全面速看!Android SQLite數(shù)據(jù)庫入門使用》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《怎么用apk修改軟件數(shù)據(jù)庫?總結很全面速看!Android SQLite數(shù)據(jù)庫入門使用》僅供讀者參考,本網(wǎng)站未對該內容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉載時請保留本站內容來源地址,http://f99ss.com/gl/3142778.html