[Android] SQLite的使用入門

來源:互聯網
上載者:User

標籤:

概述

  Android 也提供了幾種方法用來儲存資料,使得這些資料即使在程式結束以後依然不會丟失。這些方法有:     

  • 文字檔:
      可以儲存在應用程式自己的目錄下,安裝的每個app都會在/data/data/目錄下建立個檔案夾,名字和應用程式中AndroidManifest.xml檔案中的package一樣。   
  • SDcard儲存:

  • Preferences儲存:
      這也是一種經常使用的資料存放區方法,因為它們對於使用者而言是透明的,並且從應用安裝的時候就存在了。

  • Assets儲存:
      用來儲存一些唯讀資料,Assets是指那些在assets目錄下的檔案,這些檔案在你將你的應用編譯打包之前就要存在,並且可以在應用程式啟動並執行時候被訪問到。

      但有時候我們需要對儲存的資料進行一些複雜的操作,或者資料量很大,超出了文字檔和Preference的效能能的範圍,所以需要一些更加高效的方法來管理,從Android1.5開始,Android就內建SQLite資料庫了。
      SQLite它是一個獨立的,無需服務進程,支援交易處理,可以使用SQL語言的資料庫。

SQLite的特性

1、 ACID事務  
  

ACID:
  指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支援事務(Transaction)的資料庫,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證資料的正確性,交易過程極可能達不到交易方的要求。

2、 零配置 – 無需安裝和管理配置  

3、儲存在單一磁碟檔案中的一個完整的資料庫  

4、資料庫檔案可以在不同位元組順序的機器間自由的共用

5、支援資料庫大小至2TB  

6、 足夠小, 大致3萬行C代碼, 250K  

7、比一些流行的資料庫在大部分普通資料庫操作要快  

8、簡單, 輕鬆的API  

9、 包含TCL綁定, 同時通過Wrapper支援其他語言的綁定  

http://www.sqlite.org/tclsqlite.html

10、良好注釋的原始碼, 並且有著90%以上的測試覆蓋率

11、 獨立: 沒有額外依賴

12、 Source完全的Open, 你可以用於任何用途, 包括出售它

13、支援多種開發語言,C,PHP,Perl,Java,ASP.NET,Python

Android 中使用 SQLite

  Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。

建立資料庫

  Android 不自動提供資料庫。在 Android 應用程式中使用 SQLite,必須自己建立資料庫,然後建立表、索引,填充資料。Android 提供了 SQLiteOpenHelper 協助你建立一個資料庫,你只要繼承 SQLiteOpenHelper 類根據開發應用程式的需要,封裝建立和更新資料庫使用的邏輯就行了。 
  
  SQLiteOpenHelper 的子類,至少需要實現三個方法: 

public class DatabaseHelper extends SQLiteOpenHelper {    /**     * @param context  上下文環境(例如,一個 Activity)     * @param name   資料庫名字     * @param factory  一個可選的遊標工廠(通常是 Null)     * @param version  資料庫模型版本的整數     *      * 會調用父類 SQLiteOpenHelper的建構函式     */     public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {        super(context, name, factory, version);    }    /**     *  在資料庫第一次建立的時候會調用這個方法     *       *根據需要對傳入的SQLiteDatabase 對象填充表和初始化資料。     */    @Override    public void onCreate(SQLiteDatabase db) {    }    /**     * 當資料庫需要修改的時候(兩個資料庫版本不同),Android系統會主動的調用這個方法。     * 一般我們在這個方法裡邊刪除資料庫表,並建立新的資料庫表.     */    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        //三個參數,一個 SQLiteDatabase 對象,一箇舊的版本號碼和一個新的版本號碼    }    @Override    public void onOpen(SQLiteDatabase db) {        // 每次成功開啟資料庫後首先被執行        super.onOpen(db);    }}

繼承SQLiteOpenHelper之後就擁有了以下兩個方法:

  • getReadableDatabase()  建立或者開啟一個查詢資料庫

  • getWritableDatabase() 建立或者開啟一個可寫資料庫

DatabaseHelper database = new DatabaseHelper(context);//傳入一個上下文參數SQLiteDatabase db = null;db = database.getWritableDatabase();

  上面這段代碼會返回一個 SQLiteDatabase 類的執行個體,使用這個對象,你就可以查詢或者修改資料庫。 

SQLiteDatabase類為我們提供了很多種方法,而較常用的方法如下:

(int) delete(String table,String whereClause,String[] whereArgs)

  刪除資料行

(long) insert(String table,String nullColumnHack,ContentValues values)

   添加資料行

(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)

  更新資料行

(void) execSQL(String sql)

   執行一個SQL語句,可以是一個select或其他的sql語句

(void) close()

   關閉資料庫

(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

  查詢指定的資料表返回一個帶遊標的資料集。

各參數說明:
table:表名稱
colums:列名稱數組
selection:條件子句,相當於where
selectionArgs:條件陳述式的參數數組
groupBy:分組
having:分組條件
orderBy:排序類
limit:分頁查詢的限制
Cursor:傳回值,相當於結果集ResultSet

(Cursor) rawQuery(String sql, String[] selectionArgs)

  運行一個預置的SQL語句,返回帶遊標的資料集(與上面的語句最大的區別就是防止SQL注入)

  當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉資料庫連接。

建立表和索引

  為了建立表和索引,需要調用 SQLiteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有傳回值。
  例如,你可以執行如下代碼:
  

 db.execSQL("CREATE TABLE user(_id INTEGER PRIMARY KEY           AUTOINCREMENT, username TEXT, password TEXT);");

  這條語句會建立一個名為 user的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動成長的整數。另外還有兩列:username( 字元 ) 和 password( 字元 )。 SQLite 會自動為主鍵列建立索引。
  通常情況下,第一次建立資料庫時建立了表和索引。要 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。

添加資料 

  有兩種方法可以給表添加資料。

①可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的資料。execSQL() 方法適用於所有不返回結果的 SQL 陳述式。例如:

String sql = "insert into user(username,password) values (‘finch‘,‘123456‘);//插入操作的SQL語句db.execSQL(sql);//執行SQL語句

②使用 SQLiteDatabase 對象的 insert()。

ContentValues cv = new ContentValues();cv.put("username","finch");//添加使用者名稱cv.put("password","123456"); //添加密碼db.insert("user",null,cv);//執行插入操作
更新資料(修改)

①使用SQLiteDatabase 對象的 update()方法。

ContentValues cv = new ContentValues();cv.put("password","654321");//添加要更改的欄位及內容String whereClause = "username=?";//修改條件String[] whereArgs = {"finch"};//修改條件的參數db.update("user",cv,whereClause,whereArgs);//執行修改

該方法有四個參數: 
  表名;
  列名和值的 ContentValues 對象; 
  可選的 WHERE 條件; 
  可選的填充 WHERE 語句的字串,這些字串會替換 WHERE 條件中的“?”標記,update() 根據條件,更新指定列的值. 

②使用execSQL方式的實現

String sql = "update [user] set password = ‘654321‘ where username="finch";//修改的SQL語句db.execSQL(sql);//執行修改
刪除資料

①使用SQLiteDatabase 對象的delete()方法。

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

②使用execSQL方式的實現

String sql = "delete from user where username="finch";//刪除操作的SQL語句db.execSQL(sql);//執行刪除操作
查詢資料

①使用 rawQuery() 直接調用 SELECT 語句

Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"finch"});if(cursor.moveToFirst()) {    String password = c.getString(c.getColumnIndex("password"));}

  傳回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。
如果查詢是動態,使用這個方法就會非常複雜。例如,當你需要查詢的列在程式編譯的時候不能確定,這時候使用 query() 方法會方便很多。

②通過query實現查詢

  query() 方法用 SELECT 語句段構建查詢。
  SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要擷取的欄位名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。
  除了表名,其他參數可以是 null。所以代碼可寫成:

Cursor c = db.query("user",null,null,null,null,null,null);//查詢並獲得遊標if(c.moveToFirst()){//判斷遊標是否為空白    for(int i=0;i<c.getCount();i++){ c.move(i);//移動到指定記錄String username = c.getString(c.getColumnIndex("username");String password = c.getString(c.getColumnIndex("password"));    }}
使用遊標

  不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 資料庫遊標,使用遊標,你可以:  

  • 通過使用 getCount() 方法得到結果集中有多少記錄; 

  • 通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍曆所有記錄;

  • 通過 getColumnNames() 得到欄位名;

  • 通過 getColumnIndex() 轉換成欄位號;

  • 通過 getString(),getInt() 等方法得到給定欄位目前記錄的值;

  • 通過 requery() 方法重新執行查詢得到遊標;

  • 通過 close() 方法釋放遊標資源;

例如,下面代碼遍曆 user表:

 Cursor result=db.rawQuery("SELECT _id, username, password FROM user");     result.moveToFirst();     while (!result.isAfterLast()) {         int id=result.getInt(0);         String name=result.getString(1);         String password =result.getString(2);         // do something useful with these         result.moveToNext();       }       result.close();

參考:http://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/

[Android] SQLite的使用入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.