Android中每一個資料庫對建立它的應用程式包套件來說都是私有的,預設情況下其他應用程式無法直接通路此私有資料庫。所有的資料庫檔案存放在手機中的/data/data/package_name/databases路徑下,以下是常用的與資料庫相關的函數:
傳回值 | 函數 | 備注 |
static SQLiteDatabase | create(SQLiteDatabase.CursorFactory factory) | 建立一個資料庫 factory:可選的資料庫遊标工廠類,當查詢(query)被送出時,該對象會被調用來執行個體化一個遊标。 |
static SQLiteDatabase | openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags) | 根據提供的模式打開一個資料庫 path:打開或建立的資料庫檔案 factory:可選的資料庫遊标工廠類,當查詢(query)被送出時,該對象會被調用來執行個體化一個遊标。預設為null。 flags:控制資料庫的通路模式。主要有以下幾種模式: l OPEN_READWRITE l OPEN_READONLY l CREATE_IF_NECESSARY l NO_LOCALIZED_COLLATORS |
static SQLiteDatabase | openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory) | 等同于openDatabase(file.getPath(), factory, CREATE_IF_NECESSARY) |
static SQLiteDatabase | openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) | 等同于openDatabase(path,factory, CREATE_IF_NECESSARY) |
void | close() | 關閉資料庫 |
boolean | deleteDatabase(String name) | 删除指定的資料庫 name:要關閉的資料庫的名字 |
示例代碼如下:
//建立資料庫 SQLiteDatabase mydataBase=SQLiteDatabase.create(new CursorFactory(){ //工廠類,一個可選工廠類,當查詢時調用來執行個體化一個遊标 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } }); //建立或打開資料庫 SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db", MODE_PRIVATE, new CursorFactory(){ //建立新的資料庫,名稱myDatabase,模式MODE_PRIVATE,可選的遊标工廠類 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } }); SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db",MODE_PRIVATE,null); //關閉資料庫 myDataBase.close(); //删除指定名稱的資料庫 this.deleteDatabase(“myDatabase.db”); |
在對資料庫中的表進行相關操作時,可以使用非查詢的execSQL(String sql)來執行。示例代碼如下:
String CREATE_TABLE = “create table table1 (_id integer primary key autoincrement,number integer,data text)”; //建立表 myDataBase.execSQL(CREATE_TABLE); |
Android提供了非SQL指令的對資料表進行操作的方法,以下表格是一些常用方法:
傳回值 | 函數 | 備注 |
long | insert(String table, String nullColumnHack, ContentValues values) | 向表中插入一條資料 table:想要插入資料的表名 nullColumnHack:SQL不允許插入空行,初始化值為空時,這一列将會被顯示地賦一個null值 values:要插入的值,具體解釋見表格後的解釋 |
int | delete(String table, String whereClause, String[] whereArgs) | 從表中删除一行資料 table:想要删除資料的表名 whereClause:可選的where子句,如果其值為null,将會删除所有的行。 whereArgs:當在whereClause中包含”?”時,如果whereArgs的值不為null,則這個數組中的值将依次替換whereClause中出現的”?” |
Cursor | query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) | 查詢資料表 table:要查詢資料的表名 columns:要傳回的列的列名數組 selection:可選的where子句 ,如果其值為null,将會傳回所有的行 selectionArgs:當在selection中包含”?”時,如果selectionArgs的值不為null,則這個數組中的值将依次替換selection中出現的”?” groupBy:可選的group by子句,如果其值為null,将不會對行進行分組 having:可選的having子句,如果其值為null,将會包含所有的分組 orderBy:可選的order by子句,如果其值為null,将會使用預設的排序規則 limit:可選的limit子句,如果其值為null,将不會包含limit子句 關于傳回值類型Cursor将在表格後面進行解釋 |
int | update(String table, ContentValues values, String whereClause, String[] whereArgs) | 修改表中的資料 table:想要修改資料的表名 values:要更新的值,具體解釋見表格後的解釋 whereClause:可選的where子句,如果其值為null,将會修改所有的行。 whereArgs:當在whereClause中包含”?”時,如果whereArgs的值不為null,則這個數組中的值将依次替換whereClause中出現的”?” |
ContentValues主要是存放表中的資料段,以及其對應的值,與Hashtable一樣采用名值對的形式存儲,但是它存儲的名值對中,名是一個String類型,值是基本資料類型。其使用示例如下:
ContentValues args = new ContentValues(); args.put(KEY_TITLE, title); args.put(KEY_BODY, body); myDataBase.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null); |
Android采用遊标對從資料庫中查詢出來的結果進行随機的讀寫通路,在查詢資料庫後,将結果傳回給遊标(即android.database.Cursor),這是查詢結果的記錄集,示意圖如下:
_id | someNumber | |
1 | 8 | |
2 | 10 | |
3 | 2 |
Cursor類常見的方法如下:
傳回值 | 函數 | 備注 |
boolean | move(int offset) | 以目前位置為參考,将Cursor移動指定數目的位置(相對位置) |
boolean | moveToPosition(int position) | 将Cursor移動到指定位置(絕對位置) |
boolean | moveToNext() | 将Cursor向前移動一個位置 |
boolean | moveToLast() | 将Cursor向後移動一個位置 |
boolean | moveToFirst() | 将Cursor移動到第一行 |
boolean | isBeforeFirst() | 傳回Cursor是否指向第一項資料之前 |
boolean | isAfterLast() | 傳回Cursor是否指向最後一項資料之後 |
boolean | isClosed() | 傳回Cursor是否關閉 |
boolean | isFirst() | 傳回Cursor是否指向第一項資料 |
boolean | isLast() | 傳回Cursor是否指向最後一項資料 |
boolean | isNull(int columnIndex) | 傳回指定位置的值是否為null |
int | getCount() | 傳回總的項目總數 |
int | getInt(int columnIndex) | 傳回指定列中的資料的int型表示 |
int | getColumnIndex(String columnName) | 按給定的列的名字傳回列的索引值,如果不存在則傳回 -1 |
要建立一個Cursor(遊标),必須執行一個查詢,通過SQL使用rawQuery()方法或是更精心的query()方法,而不能使用execSQL(String sql)方法。以下為Cursor的使用示例:
Cursor cur=myDataBase.rawQuery("select * from test", null); if(cur!=null){//遊标不為空 //傳回給定名稱的列的基于0開始的index,如果該屬性列不存在則傳回-1 //通過它們的index來檢索屬性值 int numColumn=cur.getColumnIndex("someNumber"); if(cur.moveToFirst()){ //cur.moveToFirst()讓遊标指向第一行,如果遊标指向第一行,則傳回true do { int num=cur.getInt(numColumn);//獲得目前行該屬性的值 } while (cur.moveToNext()); //其他可能移動的是 moveToPrevious() 和moveToFirst()方法 } } |
在實際使用的時候,通常都要封裝一個繼承SQLiteOpenHelper類的資料庫操作類。SQLiteOpenHelper類是一個抽象的輔助類,主要用來生成一個資料庫并對資料庫的版本進行管理,在SQLiteOpenHelper類的構造方法中分别傳入Context、資料庫名稱,CursorFactory(一般傳入null,否則為預設資料庫),資料庫版本号(不能為負數)。在SQLiteOpenHelper中首先執行的是onCreate方法(當資料庫第一次建立時),一般在這個方法裡生成資料表。要注意的是,在構造函數時并沒有真正建立資料庫,而是在調用getWriteableDatabase()或者getReadableDatabase()方法的時候系統才會真正建立資料庫,如果當時系統中不存在這個資料庫,系統會自動生成一個資料庫,然後傳回SQLiteDatabase對象。在繼承這個類的時候,要實作裡面的3個方法,其中前兩個方法是必須重寫的。見如下表格:
傳回值 | 函數 | 備注 |
public void | onCreate(SQLiteDatabase db) | 在資料庫第一次生成時會調用這個方法,一般我們在這個方法裡生成資料表 |
public void | onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) | 當資料庫需要更新時,系統會自動調用這個方法,一般我們在這個方法裡删除資料表,并建立新的資料表,并根據實際需求做其他的操作 |
public void | onOpen(SQLiteDatabase db) | 這是打開資料庫時的回調函數,一般不會用到 |