一、廢話
今天感冒了!... ...(以下省略500字)
二、正文
1、 SQLite是個啥?
SQLite是一個極輕量型的數據庫。它在提供了和大型數據庫相當的功能,還具有輕便、跨平台等優點,SQLite使用非常方便,並不需要我們像常規數據庫(SQLServer,Mysql等)那樣進行安裝,在Android的JDK中,其實是已經包含了SQLite這個數據庫的核心。當然我們必須要強調一點,SQLite並不是只針對Android的,其實它還可以用在別的很多地方。
2、 在Android系統中如何使用SQLite數據庫?
要在Android系統中使用SQLite數據庫,其實是一件非常輕松的事情,只要繼承來自android.database.sqlite包中的SQLiteOpenHelper類,並重寫其中的幾個重要方法后,你就可以對數據庫進行相關的操作了。
1 public class MyDatabaseHelper extends SQLiteOpenHelper {
2
3 private static final String DB_NAME = "test_db"; //數據庫名稱
4 private static final int VERSION = 1; //數據庫版本
5
6 public MyDatabaseHelper(Context context) {
7 super(context, DB_NAME, null, VERSION);
8 // TODO Auto-generated constructor stub
9 }
10
11 @Override
12 public void onCreate(SQLiteDatabase db) {
13 String sql = "create table user(username varchar(25) not null , password varchar(60) not null );";
14 db.execSQL(sql);
15 }
16
17 @Override
18 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
19 // TODO Auto-generated method stub
20
21 }
22
23 }
還是先來看看SQLiteOpenHelper這個類吧。“A helper class to manage database creation and version management.”官方的一個幫助文檔這樣描述這個類,也就是說,這個類主要的作用是用來創建數據庫和對數據庫進行版本更新的。
這個類中必須重寫的兩個方法分別為:onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。
- onCreate(SQLiteDatabase db):用於創建數據庫db中的表,而不是創建db數據庫實例。這個方法並不需要我們自己去調用,當數據庫第一次被創建時,這個方法會自動被調用。那么數據庫真正的創建是在什么時候呢?當我們調用getReadableDatabase()/getWritableDatabase()方法時,數據庫會被真實的創建。
- onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):這個方法用來對數據庫進行更新操作,你可以在這個方法中定義你自己的一些操作。這個方法也不需要我們主動去調用,當SQLiteOpenHelper類的最后一個參數比原值大的時候,這個方法會自動被調用。調用的時刻同onCreate()方法。
另外在SQLiteOpenHelper類中,還有兩個方法也非常重要:getReadableDatabase(),getWritableDatabase()。
- getReadableDatabase():返回一個只讀的數據庫實例,在訪問數據庫中數據但同時又不需要對其進行數據修改時(select操作)可以使用這個方法。
- getWritableDatabase():返回一個可讀寫的數據庫實例,當需要對數據庫進行數據修改時,應該調用這個方法。記住在使用完成后,一定是要使用close()方法來釋放內存,否則會造成內存泄露。
3、 在Android系統中如何對SQLite數據庫進行常規操作?
- (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)——查詢操作,返回一個游標
- table——表名;
- columns——列名集合
- selection——在where語句中的表達式,如id=?
- selectionArgs——在where表達式中傳入的參數,也就是上面“?”所占據的值
- groupBy\having\orderby\limit——這些參數如果各位不清楚,請google下SQL語句基礎
1public Cursor Query(String table, String[] filed, long rowId)
2throws SQLException {
3
4 Cursor mCursor = _db.query(true, table, filed, "ID=?" + rowId, null,null, null, null, null);
5if (mCursor != null) {
6 mCursor.moveToFirst();
7 }
8return mCursor;
9 }
10
11public Cursor Query(String table) {
12 Cursor mCursor = _db.query(true, table, new String[] { "*" }, null,null, null, null, null, null);
13if (mCursor != null) {
14 mCursor.moveToFirst();
15 }
16return mCursor;
17 }
- (int) update(String table, ContentValues values, String whereClause, String[] whereArgs)——進行更新操作
- table——表名
- values——ContentValues類型,其實就是鍵值對,鍵代表需要修改的列名,值代表對應的新值
- whereClause——where語句中的表達式,可以直接組成一個完整的表達式如:id=1,此時whereArgs傳入null,如果id=?,那么whereArgs和query(...)的selectionArgs一樣。
- whereArgs——在where表達式中傳入的參數
1 public boolean Update(String table, String[] fieldName,
2 String[] fieldValue, long rowID) throws SQLException {
3 ContentValues cv = new ContentValues();
4 for (int i = 0; i < fieldName.length; i++) {
5 cv.put(fieldName[i], fieldValue[i]);
6 }
7 if (_db.update(table, cv, "ID=" + rowID, null) > 0) {
8 return true;
9 }
10 return false;
11 }
- (long) insert(String table,String nullColumnHack,ContentValues values)——進行插入操作
- table——表名
- nullcolumnHack——當插入空值的時候有用
- values——鍵值對,鍵代表需要修改的列名,值代表對應的新值
1 public boolean Insert(String table, String[] fieldName, String[] fieldValue) throws SQLException {
2 ContentValues cv = new ContentValues();
3 for (int i = 0; i < fieldName.length; i++) {
4 cv.put(fieldName[i], fieldValue[i]);
5 }
6 if (_db.insert(table, null, cv) > 0) {
7 return true;
8 }
9 return false;
10 }
- (int) delete(String table,String whereClause,String[] whereArgs)——進行刪除操作
- table——表名
- whereClause/whereArgs——同update()方法
1 public boolean Delete(String table, long rowID) throws SQLException {
2 if (_db.delete(table, "ID=?", new String[] { rowID + "" }) > 0)
3 return true;
4 return false;
5 }
- (void) execSQL(String sql)——執行sql語句
- 執行非select操作的語句,靈活性強。
在上面的方法中,有看不懂的地方,請看Demo源碼。
三、總結
SQLite作為一個輕型數據庫,在Android中可以用來存儲用戶數據,如短信、聯系人等信息。在Android中使用SQLite是非常靈活的,所以不一定非要按照某一種特定的方式來操作數據庫。下一篇筆記中將說說ContentProvider類。