SQLite 是一個輕量級的數據庫,支持SQL正規的SQL語句,可以存儲大量數據。
建立SQLite數據庫,要使用Android提供的一個SQLiteOpenHelper幫助類,需要新建一個類去繼承SQLiteOpenHelper類,重寫里面的兩個抽象方法,OnCreate()和OnUpgrade(),還要重寫有產構造方法,
有參構造重寫四個參數的,第一個參數是上下文,第二個是數據庫名稱,第三個是游標Cursor,通常給值null,第四個是當親數據庫的版本號。
public 重寫方法(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); MyDatabaseHelper.this.context = context; }
onCreate()方法,調用SQLiteDatabase 對象的execSQL()方法,里面的參數是建表的SQL語句,
private String sql = "create table Book(" +"id integer primary Key autoincrement," +"author text," +"price real," +"pages integer," +"name text)";
@Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(sql); }
然后在主活動中new一個繼承SQLiteOpenHelper類的對象,並且調用getWritableDatabase()或getReadableDatabase()方法。這兩者都可以創建一個數據庫,或者數據庫存在就直接打開,但是當數據庫不可寫入的時候,getReaderDatabase()方法會以只讀的方式打開數據庫,getWritableDatabase()方法則會出現異常。
在創建數據庫的時候調用的getReaderDatabase() 或getWritableDatabase()會返回一個SQLiteDatabase對象,利用該對象調用相應的方法完成數據的增刪改查
增加數據:
可以分為兩種方式:
1:new一個ContentValues,該對象提供Put()方法,數據以鍵值對的形式儲存,SQLiteDatabase對象 ,提供一個insert()方法,它接受三個參數,第一是表名,第二是在未給指定列賦值時,默認為null,第三就是ContentValues對象。
2:就是調用SQLiteDatabase對象 的execSQL()方法,里面傳值SQL語句。
/* ContentValues values = new ContentValues(); values.put("author","周生磊"); values.put("price",22); values.put("pages",33); values.put("name","android"); db.insert("Book",null,values); values.clear();*/ db.execSQL("insert into Book(author,price,pages,name) values(?,?,?,?)",new String[]{"周生磊","22","33","android"});
刪除數據:
1.同上調用delete()方法。第一個參數表名,第二個限定條件,第三個限定條件的值。
2:同上
/* db.delete("book","name=?",new String[]{"android"});*/ db.execSQL("delete from book where name = ?",new String[]{"android"});
修改數據:
1:同上,new 一個ContentValues對象,用來存放數據,SQLiteDatabase對象調用updata()方法,傳入四個參數,第一個表名,第二個需要修改的數據,第三個限定符,表示要修改哪一行等待傳值,第四個傳值具體修改哪幾行。
2:SQLiteDatabase對象的execSQL()方法,寫入SQL語句。
/*ContentValues values1 = new ContentValues(); values1.put("price",5435); db.update("book",values1,"name=?",new String[]{"android"});*/ db.execSQL("update Book set price = ? where name =?",new String[]{"4533","android"});
查詢數據:最復雜的
1:查詢數據需要調用rawQuery()方法,該方法返回值是一個Cursor(游標),利用Cursor遍歷查詢結果,首先確認cursor是否為空,調用cursor.moveToFirst(),該方法移動Cursor到第一行,如果為空就返回False,否則就是true,在進行循環進行遍歷,利用Cursor.GetString(),方法得到該列的具體參數,看到下面代碼很多人會疑問,為什么不在.GetString(),方法內直接傳入列名,而是又調用了一個Cursor.GetColumnIndex()呢?那是應為.GetString()方法內只接受Int類型的值,而.GetColumnIndex(),接受String值,返回int值,而GetColumnIndex()方法返回的int值是該列的下標,所以利用返回值得相互轉變得到我們想要的數據值。簡直完美,不是嗎?
2:調用的是RawQuery()方法,而不是execSQL()方法,里面寫入SQL語句,查詢全部則第二個限定參數為null,第二個參數類型為new String[]{}類型,用法同上一樣,SQL語句?限定,new String[]{}里面給‘?‘賦值。
/*Cursor cursor = db.query("book",null,null,null,null,null,null);*/ Cursor cursor = db.rawQuery("select * from Book",null); if (cursor.moveToFirst()){ do { //遍歷Cursor對象,並打印 String author = cursor.getString(cursor.getColumnIndex("author")); int price = cursor.getInt(cursor.getColumnIndex("price")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); String name = cursor.getString(cursor.getColumnIndex("name")); String show = "author:"+author+",price:"+price+",pages:"+pages+",name:"+name; et_show.setText(show); }while (cursor.moveToNext()); }
