Android基礎 =======SQLite資料庫的總結
在學習Android第一行程式碼的時候,由於電腦卡,執行安卓虛擬機器卡,所以一直沒有系統學習這方面內容,每次都是看一遍書就過了,現在還是一樣的電腦,用的真機測試,發現真機也可以匯出資料庫表,所以就做了一些demo來系統的學習一下SQLite資料庫的使用。
SQLite資料庫的使用
- 建立一個類繼承繼承自SQLiteOpenHelper,並且要實現onCreate和onUpgrade方法,同時也要實現構造方法
public class MySQLite extends SQLiteOpenHelper{
public MySQLite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
//第一個引數就是呼叫此類的上下文,第二個引數就是建立資料庫的檔案目錄,第三個引數是系統建立CursorFactory,
//第一行程式碼裡說這個引數允許我們在查詢資料的時候返回一個自定義的Cursor,一般傳入null
//最後一個引數是版本號
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//初始化資料庫,主要建立資料庫中的表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//如果資料庫中有資料修改,當newVersion版本號變得時候,就會呼叫這個方法
}
}
另外SQLite資料型別很簡單:integer 整形;real 浮點型;text 文字型別; blob 二進位制型別;
2. 執行資料庫中表的建立
在onCreate方法中執行建立資料庫表的SQL語句
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table text_db(_id integer primary key autoincrement," +
"name varchar(20)," +
"age integer," +
"gender varchar(2))"); }
這個方法只能執行一次,只有在資料庫第一次建立的時候才會執行。
接下來就是要操作資料庫了
首先要獲取SQLiteDatabase物件,因為增刪改查操作全在這個類中,那麼怎麼獲取這個物件呢?這個要使用getWritableDatabase(),或者是getReadableDatabase(),當然要呼叫這兩個方法就要獲取我們繼承自SQLiteOpenHelper定義的類的物件,如:MySQLite db = new MySQLite ();然後呼叫db.getWritableDatabase()或者db.getReadableDatabase(),這兩個方法的區別是,getWritableDatabase()以只讀的方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,getReadableDatabase(),getReadableDatabase()方法先以讀寫方式開啟資料庫.
倘若使用的資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以只讀方式開啟資料庫。
在AndroidStudio中可以看看原始碼,貼一小部分以示友好·······
public SQLiteDatabase getReadableDatabase() {
synchronized (this) {
return getDatabaseLocked(false);
}
}
public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}
}
`
(1) insert操作
插入操作有兩種方法,都是呼叫了SQLiteDatabase中的方法,一個是execSQL(),一個是insert(),如:
String sql = "insert into text_db(_id,name,age,gender)values("+num+",'"+namestr+"',"+agestr+",'"+sex+"')";
database.execSQL(sql);
ContentValues values = new ContentValues();
values.put("_id",num);
values.put("name",namestr);
values.put("age",agestr);
values.put("gender",sex);
database.insert("text_db",null,values);
第二種方法insert需要傳入三個引數*public long insert(String table, String nullColumnHack, ContentValues values)
第一個引數就是表的名字,第二個是在未指定新增資料的情況下,給某些可為空的列自動賦值為NULL,一般傳入null,第三個引數就是我們要新增的值,是用Hashmap來實現的
public ContentValues() {
// Choosing a default size of 8 based on analysis of typical
// consumption by applications.
mValues = new HashMap<String, Object>(8);
}
(2) delete操作
刪除操作同上,也有兩種方法,這裡只貼出第二種方法
database.delete("text_db","_id=?",new String[]{num});
這幾個引數的作用是public int delete(String table, String whereClause, String[] whereArgs)
第一個是要操作的表名,第二個是約束條件,相當於where後面的語句,第三個引數就是第二個引數列的具體的值。
下面原始碼看一下應該會很清晰了
SQLiteStatement statement = new SQLiteStatement(this, "DELETE FROM " + table +
(!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
(3) update操作
ContentValues values1 = new ContentValues();
values1.put("_id",num);
values1.put("name",namestr);
values1.put("age",agestr);
values1.put("gender",sex);
database.update("text_db",values1,"_id=?",new String[]{num});
更新操作有點類似於插入操作要傳入的引數 public int update(String table, ContentValues values, String whereClause, String[] whereArgs)—-第三個和第四個引數表示具體更新哪幾行,比如上面的就是更新_id=num的這個一行的_id,name,age和gender屬性值。
(4) query操作
這個操作步驟稍微多一點,首先說一下簡單的rawQuery的操作
String sql1 = "select * from text_db";
Cursor cursor= database.rawQuery(sql1,null);
第二個引數可以傳空值,也可以傳陣列,
String sql1 = "select * from text_db where _id=?,age=?";
Cursor cursor= database.rawQuery(sql1,new String[]{num,agestr});
使用API 的方法是
Cursor cursor = database.query("text_db",null,null,null,null,null,null);
這個要傳入的引數挺多,
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)
table : from table_name –查詢的表名
columns :select column1,column2 —指定查詢的列明
selection :where colum = value —約束條件
selectionArgs: 為where中的佔位符提供具體的值
groupBy: 指定需要groupby的列
having:根據groupby 的列進行約束
orderBy:指定查詢結果的排序方式