文章目錄
- 主要步驟:
- 具體模板代碼如下:
- 7.獲得記錄個數語句
一、SQLite介紹
SQLite是一個小型的內嵌於Android的資料庫;我們不需要引入驅動即可訪問它;
SQLite視覺化檢視:SQLite Expert Professional 3;
:http://www.kuaipan.cn/file/id_125546433842511875.htm
二、預備階段在本節中,我們會為操作資料庫做準備,即本節並不會實際操作資料庫,只是做一些前提步驟。下節中,我們將會對操作資料庫進行講解。
主要步驟:
(1)建立某個類(通常稱為DatabaseHelper)繼承SQLiteOpenHelper,並重寫以下三個方法:
- public DatabaseHelper(Context context);//帶Context參數的建構函式,用來建立資料庫
- public void onCreate(SQLiteDatabase db);//在建立資料庫時調用
- public void onUpgrade(SQLiteDatabase db,int old,int newversion); //資料庫版本更改時調用
(2)建立資料庫:
- SQLiteOpenHelper helper = new new DatabaseOpenHelper(this.getContext());
- SQLiteDatabase db = helper.getWritableDatabase();
(3)SQL語句:db.execSQL(String sql);
具體模板代碼如下:
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class DatabaseHelper extends SQLiteOpenHelper{private static final String TAG = "DatabaseHelper";private static int VERSION = 1;public DatabaseHelper(Context context) {super(context, "test.db", null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table 語句");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.i(TAG, "版本更新...");}}
當建立資料庫時,database存放在/data/data/package/databases 目錄中;
問題1:測試資料庫是否能夠成功建立
如果你想要測試建立資料庫是否成功(你自己寫的建立語句是否正確),只需要在AndroidTestCase中寫入2行代碼:
- SQLiteOpenHelper helper = new new DatabaseOpenHelper(this.getContext());
- SQLiteDatabase db = helper.getWritableDatabase();
運行測試檔案後,即可在/data/data/package/databases中產生db檔案,export到本地電腦後,用SQLite視覺化檢視看下就可以知道。
問題2:如何在onUpdate中完成版本更新
如果想要在版本更新時更新資料庫,可以使用以下技巧:
- db.execSQL("drop table if exists Table1");//如果存在Table1表,則刪除這張表,可以重複執行多次,將全部的表刪光。
- onCreate(db);
//再次建立資料庫的表結構
這樣能夠比較圓滿的完成版本更新。
三、增刪改查操作
本節將會講解到怎樣進行增刪改查,首先要注意的是:
- db.execSQL() 是執行“修改操作SQL”的。
- db.rawQuery() 是執行“查詢SQL”的。
這些CRUD操作都是封裝在SQLiteDatabase類中的。下面分別介紹:
1)獲得SQLiteDatabase對象
2)插入操作
3)刪除操作
4)查詢操作
5)更新操作
1.獲得SQLiteDatabase對象SQLiteOpenHelper helper = new DatabaseHelper(this.getContext());SQLiteDatabase db = helper.getWritableDatabase();SQLiteDatabase db = helper.getReadableDatabase();
//此函數內部其實也調用了getWritableDatabase()函數,即調用了此函數,也可以寫資料2.insert操作插入操作有三種方法完成:
- (一般)用原始SQL陳述式完成:即db.execSQL("INSERT 語句"); 很顯然,這種方法是有缺陷的,通常都是從使用者介面獲得一些資料,然後插入資料庫,因此很不靈活,組拼SQL語句是很累人的事。
- (推薦)將插入記錄用參數數組來表示:db.execSQL("insert into person(name,age) values(?,?)",new Object[]{"xiazdong",20}); 這裡類似於JDBC中的PreparedStatement,第一個參數是SQL語句,裡面可以有預留位置“?”,第二個參數是預留位置填入的內容組成的對象數組。
- (如果對SQL不熟悉,可以用這個)使用內建的insert函數:db.insert(String "tablename",String "nullColums", ContentValues values); 第一個參數是插入的表名;第二個參數是null值的列,即哪些列是有null值的,如果沒有列是null值,則直接在第二個參數處寫上null即可;第三列是存放資料的對象,資料庫的表中有很多的列,比如name,age,我們將列名作為key,對應的資料作為value,將<key,value>插入ContentValues即可。
舉例:
第一種方法:
db.insert("INSERT INTO person(name,age) VALUES('xiazdong',20);");
第二種方法:
db.insert("INSERT INTO person(name,age) VALUES(?,?);", new Object[]{"xiazdong",20});
第三種方法:
ContentValues values = new ContentValues();values.put("name","xiazdong");values.put("age",20);db.insert("tablename",null,values);
有些人肯定想不通為什麼第一種方法很累人,這裡舉個例子:比如介面要求輸入一個name值,如果使用者輸入了a'b'c'e,那麼組拼的SQL語句需要對其中的單引號轉義,這比較麻煩,因為需要人工慢慢轉才行。3.delete操作Android提供了3種方法執行delete操作,其實和INSERT操作差不多。
- 原始SQL語句:db.execSQL("delete 語句");
- 帶預留位置SQL語句:db.execSQL("delete from person where id=?",new Object[]{id});
- 內建的delete函數:db.delete("tablename","id=?",new String[]{id+""}); 第一個參數用於指定表名,第二個參數寫出SQL中where後面的條件,第三個參數為參數字串數組,存放where子句中預留位置的資訊。
4.update語句Android提供了3種方法執行update操作,其實和INSERT操作差不多。
- 原始SQL語句:db.execSQL("update 語句");
- 帶預留位置SQL語句:db.execSQL("update person set age=? where name=?",new Object[]{30,"xiazdong"});
- 內建的update函數:db.update("tablename",ContentValues values,String"where 子句", new String[]{"where子句的參數"}); 第一個參數用於指定表名,第二個參數指定set子句更新的資料,第三個參數為where子句,第四個參數存放where子句中預留位置的資訊。
由於第三個方法比較難理解,因此給出一個例子:
ContentValues values = new ContentValues(); values.put("age",30);/*set子句*/ db.update("tablename",values,"name=?"/*where子句*/,new String[]{"xiazdong"}/*where子句參數*/); |
5.query語句(1)
Cursor cursor = db.rawQuery("select * from person where name=?",new Object[]{"xiazdong"});while(cursor.moveToNext()){ //int index = cursor.getColumnIndex(String name);//根據name獲得索引 //String name = cursor.getString(int index); //根據索引獲得值 String name = cursor.getString(cursor.getColumnIndex("name")); }
(2)Cursor cursor = db.query("tablename",null/*表示select * */,"name=?"/*where語句*/,new String[]{"xiazdong"},null/*group
by 語句*/,null/*having 語句*/,null/*order by語句*/,null/*limit 語句*/);6.分頁語句Cursor cursor = db.rawQuery("select * from person limit ?,?",new Object[]{5,5}); //第一個5表示跳過5條記錄,下一個5為查詢結果的記錄個數while(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); }
7.獲得記錄個數語句(1)
Cursor cursor = db.rawQuery("select count(*) from person", null);cursor.moveToFirst();int count = cursor.getInt(0);
(2)db.query("person",new String[]{"count(*)"},null,null,null,null,null,null);三、事務操作模板代碼如下:
db.beginTransaction();try{//事務操作db.setTransactionSuccessful();//此句必須要有,不然db.endTransaction()預設為復原}finally{db.endTransaction();}