安卓的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();