android SQLite數(shù)據(jù)庫(kù)總結(jié)
SQLite
SQLite是一種超輕量級(jí)的嵌入式數(shù)據(jù)庫(kù),大小只有幾百KB,但是其語(yǔ)法支持標(biāo)準(zhǔn)SQL語(yǔ)法,同時(shí)還遵循了數(shù)據(jù)庫(kù)的ACID事務(wù),所以學(xué)過(guò)其他數(shù)據(jù)庫(kù)的開(kāi)發(fā)人員都很容易掌握其使用。
sql語(yǔ)法就不介紹了,直接看在android中的使用
SQLiteOpenHelper——封裝好的數(shù)據(jù)庫(kù)操作輔助類,需重寫(xiě)
重寫(xiě)方法
onCreate:初始化數(shù)據(jù)庫(kù),創(chuàng)建表,添加初始數(shù)據(jù)
onUpgrade:數(shù)據(jù)庫(kù)版本升級(jí)時(shí)的數(shù)據(jù)庫(kù)操作,如備份刪除數(shù)據(jù)庫(kù)等
常用方法
getReadableDatabase() 獲取SQLiteDatabase對(duì)象,操作數(shù)據(jù)庫(kù)
getWritableDatabase() 獲取SQLiteDatabase對(duì)象,操作數(shù)據(jù)庫(kù)
區(qū)別:在磁盤(pán)空間滿或不可寫(xiě)時(shí),1方法將獲得只讀的數(shù)據(jù)庫(kù)對(duì)象,而2方法會(huì)報(bào)錯(cuò),在正常情況下,獲取到的都是可讀寫(xiě)的數(shù)據(jù)庫(kù)對(duì)象。
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";//數(shù)據(jù)庫(kù)名 private static final int version=1;//版本號(hào) //重寫(xiě)構(gòu)造方法的時(shí)候選擇參數(shù)少的一項(xiàng) public DBHelper(Context context) { //1:上下文 2:數(shù)據(jù)庫(kù)名稱 3:游標(biāo)創(chuàng)建工廠 4:數(shù)據(jù)庫(kù)版本 版本只能是整數(shù) 1 2 3.. super(context, name, null, version); } //數(shù)據(jù)庫(kù)的初始化 SQLiteDatabase數(shù)據(jù)庫(kù)操作對(duì)象 //一般只在第一次運(yùn)行和版本更新的時(shí)候調(diào)用 @Override public void onCreate(SQLiteDatabase db) { //創(chuàng)建數(shù)據(jù)庫(kù) 主鍵默認(rèn)自增 db.execSQL("create table student(" + "_id integer not null primary key autoincrement," + "name varchar(20)," + "phone varchar(11)," + "gender varchar(2))"); //添加一條測(cè)試數(shù)據(jù) db.execSQL("insert into student values(null,?,?,?)" ,new Object[]{"小黑","12345678901","男"}); } /** * 在版本升級(jí)的時(shí)候調(diào)用 * 修改version 為2 表示版本升級(jí) 就會(huì)調(diào)用這個(gè)方法 * @param db 數(shù)據(jù)庫(kù)操作對(duì)象 * @param oldVersion 舊版本號(hào) * @param newVersion 新版本號(hào) */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
在android數(shù)據(jù)庫(kù)的創(chuàng)建是需要?jiǎng)?chuàng)建對(duì)象才能創(chuàng)建的
在activity類中創(chuàng)建出一個(gè)數(shù)據(jù)庫(kù)類對(duì)象
創(chuàng)建好數(shù)據(jù)對(duì)象就可以操作數(shù)據(jù)了 通過(guò)SQLiteDatabase獲取 兩種獲取方法的區(qū)別上面已經(jīng)提到過(guò)了
//創(chuàng)建數(shù)據(jù) DBHelper helper =new DBHelper(this); //調(diào)用數(shù)據(jù)操作對(duì)象 SQLiteDatabase dbWrite=helper.getWritableDatabase(); SQLiteDatabase dbRead=helper.getReadableDatabase();
SQLiteDatabase給我們提供了很多操作數(shù)據(jù)的方法
刪除:(int) delete(String table,String whereClause,String[] whereArgs)
table: 表名
whereClause:where條件 列名 占位符 id=?
whereArgs:參數(shù)值數(shù)組
添加:(long) insert(String table,String nullColumnHack,ContentValues values)
nullColumnHack:為空列
ContentValues values:通過(guò)鍵值對(duì)存儲(chǔ)添加的數(shù)據(jù) key為列 value為值
insert方法 底層是通過(guò)拼接字符串的方式 如果ContentValues是空的 拼接成的sql語(yǔ)句無(wú)法執(zhí)行會(huì)報(bào)錯(cuò) 所以給一個(gè)可以為空的列當(dāng)ContentValues為空時(shí)也可以執(zhí)行 有興趣的可以看一下源碼
更新:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
參數(shù)意思同上
查詢:(Cursor) query(boolean distinct,String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
返回值是一個(gè)游標(biāo) 這個(gè)query參數(shù)較多 簡(jiǎn)單的查詢就還是寫(xiě)一條sql語(yǔ)句簡(jiǎn)單點(diǎn)
boolean distinct 去重復(fù)
String table 表名
String[] columns要查詢的列
String selection查詢條件
String[] selectionArgs查詢參數(shù)值
String groupBy分組
String having分組條件
String orderBy排序
String limit分頁(yè)查詢限制
關(guān)閉數(shù)據(jù)庫(kù):(void) close()
執(zhí)行一條sql語(yǔ)句:(void) execSQL(String sql) 增刪改查
查詢查詢sql:(Cursor) rawQuery(String sql, String[] selectionArgs)
事務(wù)
try { db.beginTransaction();//開(kāi)啟事務(wù) // db.update(); // db.insert(); db.setTransactionSuccessful(); //沒(méi)有設(shè)置事物成功 finally就會(huì)回滾 } catch (Exception e) { e.printStackTrace(); }finally { db.endTransaction(); }
貼代碼咯 執(zhí)行sql語(yǔ)句 和封裝好的方法
查詢
private void query() { StringBuffer sb=new StringBuffer("select * from student where 1=1"); //參數(shù)集合 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); //返回值 游標(biāo) Cursor cursor=db.rawQuery(sb.toString(),projection); //判斷游標(biāo)是否為空,是否有一個(gè)值 while(cursor!=null&&cursor.moveToNext()){ // getColumnIndex獲取列的下標(biāo) cursor.getXXXX()獲取指定列的值 String name=cursor.getString(cursor.getColumnIndex("name")); Integer id=cursor.getInt(cursor.getColumnIndex("_id")); } }
用不到的參數(shù)就讓它為空吧 遍歷數(shù)據(jù)就while循環(huán)就好咯
Cursor c = db.query("student",null,null,null,null,null,null);//查詢并獲得游標(biāo)
更新
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){ //更新操作拼接字符串末尾有一個(gè)","需要去除 //刪除最后一位的“,” sb.setLength(sb.length()-1); sb.append(" where 1=1"); //通過(guò)id指定 更新那行數(shù)據(jù) if(!TextUtils.isEmpty(id)){ sb.append(" and _id=?"); params.add(id); }else{ Toast.makeText(this,"請(qǐng)?zhí)顚?xiě)id",Toast.LENGTH_SHORT).show(); return; } SQLiteDatabase db=helper.getWritableDatabase(); Object [] o=new Object[params.size()]; params.toArray(o);//將數(shù)據(jù)存放到指定的數(shù)組中 db.execSQL(sb.toString(),o); } }
ContentValues cv = new ContentValues();//實(shí)例化ContentValues cv.put("name","123");//添加要更改的字段及內(nèi)容 String whereClause = "phone=?";//修改條件 String[] whereArgs = {"12312313213"};//修改條件的參數(shù) db.update("student",cv,whereClause,whereArgs);//執(zhí)行修改
刪除
private void delete() { getAllText(); //拼接sql語(yǔ)句 StringBuffer sb=new StringBuffer("delete from student where 1=1"); //保存參數(shù)的list List params=new ArrayList(); //判斷條件 動(dòng)態(tài)拼接 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);//將數(shù)據(jù)存放到指定的數(shù)組中 //執(zhí)行刪除 db.execSQL(sb.toString(),o); }else{ db.execSQL(sb.toString()); } Toast.makeText(this,"刪除完成",Toast.LENGTH_SHORT).show(); }
String whereClause = "name=?";//刪除的條件 String[] whereArgs = {"123"};//刪除的條件參數(shù) db.delete("student",whereClause,whereArgs);//執(zhí)行刪除
增加
private void insert() {//保存數(shù)據(jù)到object數(shù)組 Object [] o=new Object[]{name,phone,gender}; //獲取數(shù)據(jù)庫(kù)操作對(duì)象 SQLiteDatabase db=helper.getWritableDatabase(); //sql:sql語(yǔ)句 bingArgs:參數(shù)數(shù)組 db.execSQL("insert into student values(null,?,?,?)",o); //關(guān)閉連接 db.close(); Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show(); }
ContentValues cv = new ContentValues();//實(shí)例化一個(gè)ContentValues用來(lái)裝載待插入的數(shù)據(jù) cv.put("name","123"); db.insert("student",null,cv);//執(zhí)行插入操作
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android編程之SQLite數(shù)據(jù)庫(kù)操作方法詳解
- Android SQLite事務(wù)處理結(jié)合Listview列表顯示功能示例
- Android開(kāi)發(fā)筆記SQLite優(yōu)化記住密碼功能
- Android利用listview控件操作SQLite數(shù)據(jù)庫(kù)實(shí)例
- Android批量插入數(shù)據(jù)到SQLite數(shù)據(jù)庫(kù)的方法
- Android SQLite數(shù)據(jù)庫(kù)基本操作方法
- Android使用SQLite數(shù)據(jù)庫(kù)的示例
- Android SQLite數(shù)據(jù)庫(kù)版本升級(jí)的管理實(shí)現(xiàn)
相關(guān)文章
解決EditText編輯時(shí)hint 在6.0 手機(jī)上顯示不出來(lái)的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決EditText編輯時(shí)hint 在6.0 手機(jī)上顯示不出來(lái)的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Android ViewDragHelper完全解析 自定義ViewGroup神器
這篇文章主要為大家詳細(xì)介紹了Android ViewDragHelper完全解析,自定義ViewGroup神器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android 拍照并對(duì)照片進(jìn)行裁剪和壓縮實(shí)例詳解
這篇文章主要介紹了Android 拍照并對(duì)照片進(jìn)行裁剪和壓縮實(shí)例詳解的相關(guān)資料,這里提供實(shí)例代碼,需要的朋友可以參考下2017-07-07Android Jetpack導(dǎo)航組件Navigation創(chuàng)建使用詳解
這篇文章主要為大家介紹了Android Jetpack導(dǎo)航組件Navigation創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android 選擇相冊(cè)照片并返回功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 從相冊(cè)中選擇照片并返回功能,需要的朋友可以參考下2018-03-03Android 雙擊Back鍵退出應(yīng)用的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 雙擊Back鍵退出應(yīng)用的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10分享一個(gè)Android設(shè)置圓形圖片的特別方法
圓形圖片想必是項(xiàng)目開(kāi)發(fā)中也是不少用的一個(gè)知識(shí)點(diǎn)吧。那么這里學(xué)習(xí)一下簡(jiǎn)單的制作圓形圖片,這個(gè)方法不用于平時(shí)的實(shí)現(xiàn)方法,有需要的可以參考借鑒。2016-09-09Android進(jìn)階Handler應(yīng)用線上卡頓監(jiān)控詳解
這篇文章主要為大家介紹了Android進(jìn)階Handler應(yīng)用線上卡頓監(jiān)控詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android屬性動(dòng)畫(huà)實(shí)現(xiàn)布局的下拉展開(kāi)效果
這篇文章主要為大家詳細(xì)介紹了Android屬性動(dòng)畫(huà)實(shí)現(xiàn)布局的下拉展開(kāi)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Flutter使用Provider進(jìn)行狀態(tài)管理的實(shí)現(xiàn)
Provider是Flutter中一個(gè)非常流行的狀態(tài)管理工具,它可以幫助開(kāi)發(fā)者更有效地管理Widget樹(shù)中的數(shù)據(jù),本文主要介紹了Flutter使用Provider進(jìn)行狀態(tài)管理的實(shí)現(xiàn),感興趣的可以了解一下2024-04-04