Android App使用SQLite數(shù)據(jù)庫的一些要點(diǎn)總結(jié)
/DATA/data/包名/databases是該程序存放數(shù)據(jù)的目錄,DATA是Environment.getDataDirectory() 方法返回的路徑。找到數(shù)據(jù)庫之后可以選中user.db 執(zhí)行導(dǎo)出。
用真機(jī)調(diào)試,data目錄如果打不開,說明你的手機(jī)沒有root,改用模擬器就OK了。
1.獲取SQLiteDatabase對象:
SQLiteDatabase db = openOrCreateDatabase(File file, SQLiteDatabase.Cursor, Factory factor);
2.SQLiteDatabase提供了如下方法:
db.execSQL(sql) //執(zhí)行任何SQL語句 db.insert(table, nullColumnHack, value) //(增) db.delete(table, whereClause, whereArgs) //(刪) db.updata(table, values, whereClause, whereArgs) //(改) db.query(table,columns,whereClause,whereArgs,groupBy,having,orderBy) //(查) db.rawQuery(sql, selectionArgs) //可以使用SQL語句直接查詢
3.執(zhí)行query和rawQuery操作,返回一個Cursor游標(biāo)對象,它可以遍歷整個查詢處的內(nèi)容,Cursor提供了如下方法來移動游標(biāo):
c.move( int offset) //游標(biāo)向上或向下移動指定行數(shù),正數(shù)向下,負(fù)數(shù)向上 c.moveToFirst() //移動到第一行,返回布爾值 c.moveToLast() c.moveToNext() c.moveToPostion(int postion) //移動到指定行,返回布爾值 c.moveToPrevious() //移動到上一行 c.isFirst(); //是否指向第一條 c.isLast(); //是否指向最后一條 c.isBeforeFirst(); //是否指向第一條之前 c.isAfterLast(); //是否指向最后一條之后 c.isNull(int columnIndex); //指定列是否為空(列基數(shù)為0) c.isClosed(); //游標(biāo)是否已關(guān)閉 c.getCount(); //總數(shù)據(jù)項(xiàng)數(shù) c.getPosition(); //返回當(dāng)前游標(biāo)所指向的行數(shù) c.getColumnIndex(String columnName); //返回某列名對應(yīng)的列索引值 c.getString(int columnIndex); //返回當(dāng)前行指定列的值
下面是一個創(chuàng)建一個SQLiteDatabase對象,只用SQL語句進(jìn)行查詢的實(shí)例
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//每個程序都有自己的數(shù)據(jù)庫,而且互不干擾
//創(chuàng)建一個數(shù)據(jù)庫,并且打開,這個方法返回的是一個SQLiteDadabase對象(如果沒有就創(chuàng)建,有就直接打開)
//這個數(shù)據(jù)庫的名字叫user.db,這樣取名是為了以后導(dǎo)出到電腦上后方便第三方軟件打開,第二個參數(shù)是一個常量,此例表示私有別的數(shù)據(jù)庫無法訪問
SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null);
//創(chuàng)建一張表 usertb ,主鍵名字建議寫成_id, 1個主鍵,3列, 加上_id總共4列
db.execSQL("create table if not exists usertb(_id integer primary key autoincrement, name text not null, age integer not null, sex text not null)");
//往這張表usertb中加3條數(shù)據(jù),分別3列,3個對應(yīng)的值
db.execSQL("insert into usertb(name, age, sex) values('Jack','18','男')");
db.execSQL("insert into usertb(name, age, sex) values('Hellen','19','女')");
db.execSQL("insert into usertb(name, age, sex) values('Mike','20','男')");
//查詢數(shù)據(jù),第一個參數(shù)還是一條語句,查詢方法,指定如何查找查詢條件, 第二個參數(shù)是查詢條件,默認(rèn)把數(shù)據(jù)全部查詢出來
//這里的返回值是Cursor,是查詢數(shù)據(jù)后得到的管理集合的一個類,可以理解為list(游標(biāo)接口)
Cursor c = db.rawQuery("select * from usertb", null);
if (c!= null){ //如果能查詢到數(shù)據(jù)
c.moveToFirst(); //如果沒有處理過數(shù)據(jù),這條可以省略,默認(rèn)光標(biāo)第一行
while(c.moveToNext()){ //每次只能查詢到一條數(shù)據(jù),判斷是否能查詢到下一行(重點(diǎn):每次光標(biāo)到達(dá)一行后,下面的語句依次打印那一行中的數(shù)據(jù),再循環(huán),打印下面一行數(shù)據(jù))
Log.i ("info", " "+ c.getInt(c.getColumnIndex("_id"))); //第一個字段int型, 需要轉(zhuǎn)成String型才能用Log打?。ㄕ业竭@一條數(shù)據(jù)中字段角標(biāo)為0的integer型數(shù)據(jù))
Log.i("info", c.getString(c.getColumnIndex("name"))); //第二個字段是text型
Log.i("info", " "+c.getInt(c.getColumnIndex("age")));
Log.i("info", c.getString(c.getColumnIndex("sex")));
Log.i("info", "~~~~~~~~"); //測試一次循環(huán)有多少數(shù)據(jù)被打印
}
c.close(); //查詢完,游標(biāo)一定要釋放
}
db.close();
}
4.增刪查改的相關(guān)參數(shù):
table:查詢數(shù)據(jù)的表名
columns: 要查詢出來的列名
whereClause: 查詢條件子句,允許使用占位符"?"
whereArgs: 用于為占位符傳入?yún)?shù)值
groupBy:用于控制分組
having:用于對分組進(jìn)行過濾
orderBy:用于對記錄進(jìn)行排序
ContentValues是對key/value的一個包裝,使用它可以將要插入或者要修改的數(shù)據(jù)以key/value的形式進(jìn)行封裝,在使用相應(yīng)增改方法的時候直接使用。
它有兩個存入和取出兩個方法:
put(String key,Xxx); getAsXxx(String Key);
下面一個實(shí)例,使用內(nèi)置函數(shù)操作數(shù)據(jù)庫增刪改查:
SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists usertb(_id integer primary key autoincrement, name text not null, age integer not null, sex integer not null) ");
//在執(zhí)行增、改方法之前,先創(chuàng)建insert方法中的一個ContentValues對象,再對這個對象存入數(shù)據(jù),存完后把values插入
ContentValues values = new ContentValues();
//增
values.put("name", "張三");
values.put("age",18);
values.put("sex","男");
db.insert("usertb", null, values); //插入方法的返回值是一個long,表示新添記錄的行號
values.clear(); //在插入下一條數(shù)據(jù)前需要把values清空,再對values存入新數(shù)據(jù)
values.put("name", "李四");
values.put("age",19);
values.put("sex","男");
db.insert("usertb", null, values);
values.clear();
values.put("name", "王五");
values.put("age",20);
values.put("sex","男");
db.insert("usertb", null, values);
values.clear();
//改 (將id大于的性別改成女
values.put("sex", "女");
db.update("usertb", values, "_id >?", new String[]{"2"});
//刪 (將名字里帶三的人刪除)
db.delete("uesrtb", "name like ?", new String [] {"%三%"});
//查 (查詢usertb這張表,所有行都差,_id >0的數(shù)據(jù)都查,查詢出的數(shù)據(jù)按照name排序)
Cursor c = db.query("usertb", null, "_id > ?", new String[]{"0"}, null, null, "name");
c.close();
//關(guān)閉當(dāng)前數(shù)據(jù)庫
db.close();
//刪除user.db數(shù)據(jù)庫(注意不是表名table)
deleteDatabase("user.db");
5.SQLiteOpenHelper :
SQLiteOpenHelper是一個幫助類,通過繼承它并實(shí)現(xiàn)onCreate方法和Upgrade方法,來管理我們的數(shù)據(jù)庫。
SQLiteDatabase db = helper.getWritableDatabase(); SQLiteDatabase db = helper.getReadableDatabase();
下面一個實(shí)例,新建一個類繼承SQLiteOpenHelper
public class DBOpenHelper extends SQLiteOpenHelper{
public DBOpenHelper(Context context, String name) {
super(context, name, null, 1);
}
public DBOpenHelper(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override//首次創(chuàng)建數(shù)據(jù)庫的時候調(diào)用 一般可以把建庫 建表的操作
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");
db.execSQL("insert into stutb(name,sex,age)values('張三','女',18)");
}
@Override//當(dāng)數(shù)據(jù)庫的版本發(fā)生變化的時候 會自動執(zhí)行
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
然后在主activity中就可以創(chuàng)建這個子類的對象,通過這個類的get方法得到SQLiteDatabase對象
DBOpenHelper helper =new DBOpenHelper(MainActivity.this, "stu.db"); SQLiteDatabase db = helper.getWritableDatabase();
- android studio使用SQLiteOpenHelper()建立數(shù)據(jù)庫的方法
- Android Studio 通過登錄功能介紹SQLite數(shù)據(jù)庫的使用流程
- Android使用SQLite數(shù)據(jù)庫的示例
- Android創(chuàng)建和使用數(shù)據(jù)庫SQLIte
- 實(shí)例講解Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法
- Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法
- Android使用SQLite數(shù)據(jù)庫的簡單實(shí)例
- Android SQLite數(shù)據(jù)庫增刪改查操作的使用詳解
- SQLite數(shù)據(jù)庫在Android中的使用小結(jié)
相關(guān)文章
Android實(shí)現(xiàn)可復(fù)用的篩選頁面
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可復(fù)用的篩選頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Android實(shí)現(xiàn)動態(tài)添加數(shù)據(jù)與堆疊折線圖詳解流程
堆疊折線圖是折線圖的一種,堆積折線圖用于顯示每一數(shù)值所占大小隨時間或有序類別而變化的趨勢,可能顯示數(shù)據(jù)點(diǎn)以表示單個數(shù)據(jù)值,也可能不顯示這些數(shù)據(jù)點(diǎn)。堆疊折線圖中,類別數(shù)據(jù)沿水平軸均勻分布,所有值數(shù)據(jù)沿垂直軸均勻分布2021-10-10
Android開發(fā)中TextView文本過長滾動顯示實(shí)現(xiàn)方法分析
這篇文章主要介紹了Android開發(fā)中TextView文本過長滾動顯示實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android項(xiàng)目開發(fā)中TextView顯示超長文本的具體操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-02-02
Android開發(fā)之React Navigation 導(dǎo)航欄樣式調(diào)整+底部角標(biāo)消息提示
這篇文章主要介紹了React Navigation 導(dǎo)航欄樣式調(diào)整+底部角標(biāo)消息提示的相關(guān)知識,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05
Android編程實(shí)現(xiàn)仿心跳動畫效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿心跳動畫效果的方法,實(shí)例分析了Android基于線程實(shí)現(xiàn)動畫過度效果的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
OnSharedPreferenceChangeListener詳解及出現(xiàn)不觸發(fā)解決辦法
本文主要介紹 Android OnSharedPreferenceChangeListener的知識,在Android應(yīng)用開發(fā)過程中會遇到監(jiān)聽器不觸發(fā)事件問題,這里介紹了相應(yīng)的解決辦法2016-08-08
詳解Android中OkHttp3的例子和在子線程更新UI線程的方法
本篇文章主要介紹了詳解Android中OkHttp3的例子和在子線程更新UI線程的方法 ,非常具有實(shí)用價值,需要的朋友可以參考下2017-05-05
Android開發(fā)Jetpack組件WorkManager用例詳解
這篇文章主要為大家介紹了Android開發(fā)Jetpack組件WorkManager的使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02

