android SQLite資料庫總結,androidsqlite
SQLite
SQLite是一種超輕量級的嵌入式資料庫,大小隻有幾百KB,但是其文法支援標準SQL文法,同時還遵循了資料庫的ACID事務,所以學過其他資料庫的開發人員都很容易掌握其使用。
sql文法就不介紹了,直接看在android中的使用
SQLiteOpenHelper——封裝好的資料庫操作輔助類,需重寫
重寫方法
onCreate:初始化資料庫,建立表,添加初始資料
onUpgrade:資料庫版本升級時的資料庫操作,如備份刪除資料庫等
常用方法
getReadableDatabase() 擷取SQLiteDatabase對象,操作資料庫
getWritableDatabase() 擷取SQLiteDatabase對象,操作資料庫
區別:在磁碟空間滿或不可寫時,1方法將獲得唯讀資料庫物件,而2方法會報錯,在正常情況下,擷取到的都是可讀寫的資料庫物件。
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper { private static final String name="my";//資料庫名 private static final int version=1;//版本號碼 //重寫構造方法的時候選擇參數少的一項 public DBHelper(Context context) { //1:上下文 2:資料庫名稱 3:遊標建立工廠 4:資料庫版本 版本只能是整數 1 2 3.. super(context, name, null, version); } //資料庫的初始化 SQLiteDatabase資料庫操作對象 //一般只在第一次運行和版本更新的時候調用 @Override public void onCreate(SQLiteDatabase db) { //建立資料庫 主鍵預設自增 db.execSQL("create table student(" + "_id integer not null primary key autoincrement," + "name varchar(20)," + "phone varchar(11)," + "gender varchar(2))"); //添加一條測試資料 db.execSQL("insert into student values(null,?,?,?)" ,new Object[]{"小黑","12345678901","男"}); } /** * 在版本升級的時候調用 * 修改version 為2 表示版本升級 就會調用這個方法 * @param db 資料庫操作對象 * @param oldVersion 舊版本號碼 * @param newVersion 新版本號碼 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
在android資料庫的建立是需要建立對象才能建立的
在activity類中建立出一個資料庫類對象
建立好資料對象就可以操作資料了 通過SQLiteDatabase擷取 兩種擷取方法的區別上面已經提到過了
//建立資料 DBHelper helper =new DBHelper(this); //調用資料操作對象 SQLiteDatabase dbWrite=helper.getWritableDatabase(); SQLiteDatabase dbRead=helper.getReadableDatabase();
SQLiteDatabase給我們提供了很多操作資料的方法
刪除:(int) delete(String table,String whereClause,String[] whereArgs)
table: 表名
whereClause:where條件 列名 預留位置 id=?
whereArgs:參數值數組
添加:(long) insert(String table,String nullColumnHack,ContentValues values)
nullColumnHack:為空白列
ContentValues values:通過索引值對儲存添加的資料 key為列 value為值
insert方法 底層是通過拼接字串的方式 如果ContentValues是空的 拼接成的sql語句無法執行會報錯 所以給一個可以為空白的列 當ContentValues為空白時也可以執行 有興趣的可以看一下源碼
更新:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
參數意思同上
查詢:(Cursor) query(boolean distinct,String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
傳回值是一個遊標 這個query參數較多 簡單的查詢就還是寫一條sql語句簡單點
boolean distinct 去重複
String table 表名
String[] columns要查詢的列
String selection查詢條件
String[] selectionArgs查詢參數值
String groupBy分組
String having分組條件
String orderBy排序
String limit分頁查詢限制
關閉資料庫:(void) close()
執行一條sql語句:(void) execSQL(String sql) 增刪改查
查詢查詢sql:(Cursor) rawQuery(String sql, String[] selectionArgs)
事務
try { db.beginTransaction();//開啟事務 // db.update(); // db.insert(); db.setTransactionSuccessful(); //沒有設定事物成功 finally就會復原 } catch (Exception e) { e.printStackTrace(); }finally { db.endTransaction(); }
貼代碼咯 執行sql語句 和封裝好的方法
查詢
private void query() { StringBuffer sb=new StringBuffer("select * from student where 1=1"); //參數集合 List<String> params=new ArrayList<>(); if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); } if(!TextUtils.isEmpty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append(" and name=?"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append(" and gender=?"); params.add(gender); } SQLiteDatabase db=helper.getReadableDatabase(); String [] projection=new String [params.size()]; params.toArray(projection); //傳回值 遊標 Cursor cursor=db.rawQuery(sb.toString(),projection);
//判斷遊標是否為空白,是否有一個值 while(cursor!=null&&cursor.moveToNext()){ // getColumnIndex擷取列的下標 cursor.getXXXX()擷取指定列的值 String name=cursor.getString(cursor.getColumnIndex("name")); Integer id=cursor.getInt(cursor.getColumnIndex("_id")); } }
用不到的參數就讓它為空白吧 遍曆資料就while迴圈就好咯
Cursor c = db.query("student",null,null,null,null,null,null);//查詢並獲得遊標
更新
private void update() { StringBuffer sb=new StringBuffer("update student set "); List params=new ArrayList(); if(!TextUtils.isEmpty(phone)){ sb.append("phone=?,"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append("name=?,"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append("gender=?,"); params.add(gender); } if (params.size()!=0){ //更新操作拼接字串末尾有一個","需要去除 //刪除最後一位的“,” sb.setLength(sb.length()-1); sb.append(" where 1=1"); //通過id指定 更新那行資料 if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); }else{ Toast.makeText(this,"請填寫id",Toast.LENGTH_SHORT).show(); return; } SQLiteDatabase db=helper.getWritableDatabase(); Object [] o=new Object[params.size()]; params.toArray(o);//將資料存放到指定的數組中 db.execSQL(sb.toString(),o); } }
ContentValues cv = new ContentValues();//執行個體化ContentValuescv.put("name","123");//添加要更改的欄位及內容String whereClause = "phone=?";//修改條件String[] whereArgs = {"12312313213"};//修改條件的參數db.update("student",cv,whereClause,whereArgs);//執行修改
刪除
private void delete() { getAllText(); //拼接sql語句 StringBuffer sb=new StringBuffer("delete from student where 1=1"); //儲存參數的list List params=new ArrayList(); //判斷條件 動態拼接 if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); } if(!TextUtils.isEmpty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!TextUtils.isEmpty(name)){ sb.append(" and name=?"); params.add(name); } if(!TextUtils.isEmpty(gender)){ sb.append(" and gender=?"); params.add(gender); } SQLiteDatabase db=helper.getWritableDatabase(); if (params.size()!=0){ Object [] o=new Object[params.size()]; params.toArray(o);//將資料存放到指定的數組中 //執行刪除 db.execSQL(sb.toString(),o); }else{ db.execSQL(sb.toString()); } Toast.makeText(this,"刪除完成",Toast.LENGTH_SHORT).show(); }
String whereClause = "name=?";//刪除的條件String[] whereArgs = {"123"};//刪除的條件參數db.delete("student",whereClause,whereArgs);//執行刪除
增加
private void insert() {//儲存資料到object數組 Object [] o=new Object[]{name,phone,gender}; //擷取資料庫操作對象 SQLiteDatabase db=helper.getWritableDatabase(); //sql:sql語句 bingArgs:參數數組 db.execSQL("insert into student values(null,?,?,?)",o); //關閉串連 db.close(); Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show(); }
ContentValues cv = new ContentValues();//執行個體化一個ContentValues用來裝載待插入的資料cv.put("name","123"); db.insert("student",null,cv);//執行插入操作