天天看點

Adroid資料庫--SQLite3

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
Adroid資料庫--SQLite3
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) 這是打開資料庫時的回調函數,一般不會用到