安卓的sqlite用法

張貼日期:2013/7/3 上午 02:10:24

首先要擴展類,SqliteOH=類名稱,可自取名子

class SqliteOH extends SQLiteOpenHelper {

public SqliteOH (final Context context , final String name , final CursorFactory factory , final int version ) {

//name=sqlite檔案路徑

//version一定要=2

super( context , name , factory , version );

}

@Override

public void onCreate( final SQLiteDatabase db ) {

//如果路徑上的檔案不存在,這裡處理建檔,建庫,建表

}

@Override

public void onUpgrade( final SQLiteDatabase db , final int oldVersion , final int newVersion ) {

//檔案的Version跟你現在的Version不一樣的時候要處理的方法,基本上遇不到

}

}

然後

SqliteOH soh =new SqliteOH(getBaseContext(),"檔案路徑",null,2);

SQLiteDatabase db = soh.getReadableDatabase();//唯獨

SQLiteDatabase db = soh.getWritableDatabase();//可讀寫

//SQLiteDatabase 本身是sync的,可同時被多個線程使用

然後查詢

//sql先寫入查詢參數,也可用?,然後用陣列傳入,因為參數隻能傳字串,數字或日期傳入比較不方便

Cursor c =db.rawQuery( "...SQL查詢指令..." , String[] );

Cursor是查詢結果的"讀取頭" , 要再下指令讀取某行的某欄 , Cursor產生不會很久,不需要用背景線程

c.getCount() //0就是沒有任何查詢結果,大於0就有資料

//循序讀取方法A

//bool c.moveToFirst() 如果true就是有查到資料,如果false就是沒有任何查詢結果

//bool c.moveToNext() 如果true=還有下一筆,繼續讀取,flase=就沒了

if ( c.moveToFirst() ) {

do {

//讀取欄位

} while( c.moveToNext() );

}

//指定某行讀取

//如果有多個線程要操作Cursor,需要加上synchronized

synchronized( c ) {

if ( c.getPosition() != i ) { //如果"讀取頭不是在指定的行"

c.moveToPosition( i ); //移動到指定行

}

//讀取欄位

}

//循環讀取方法B,用指定行存取

//如果有多個線程要操作Cursor,需要加上synchronized

for( int i = 0 , i2 = c_fam.getCount() ; i < i2 ; i++ ) {

synchronized( c ) {

if ( c.getPosition() != i ) { //如果"讀取頭不是在指定的行"

c.moveToPosition( i ); //移動到指定行

}

//讀取欄位

}

}

//讀取欄位說明

c.getColumnCount() //確認有多少欄位

c.getColumnName( int ) //讀取指定位置的欄位"名稱" , 以下int 代表欄位位置,從0開始

c.getString( int ) //字串

//有小數點的數字

c.getFloat( int )

c.getDouble( int )

//整數,長整數

c.getInt( int )

c.getLong( int )

//讀取byte[] //二進制內容

c.getBlob( int )

//當讀取完了,"讀取頭"不想要了,請關閉.

c.close();

新增

ContentValues cv = new ContentValues();//用來放欄位=參數的

cv.putNull( "欄位名稱" );//該欄位=null

cv.put( "欄位名稱" , 123.456 );//有小數點的數字

cv.put( "欄位名稱" , "字串" );//文字

cv.put( "欄位名稱" , 123 );//整數

cv.put( "欄位名稱" , Byte[] );//二進制內容

//中間參數是字串,內容是表名稱,可多個,在此出現的表名稱,如果沒有cv.put,就傳入null,不好用,建議用cv.putNull

db.insertOrThrow( "collect" , null , cv );

刪除

//後面一樣是參數

db.delete( "表名" , "欄位=條件 AND 欄位2=條件2 OR 欄位3=? ..." , String[] );

程式結束前,關閉資料庫

db.close();

soh.close();