2019.1.20
弄了一下午,終于把這個sqlite稍微弄懂了,
參考了這兩篇博客:
AndroidStudio3.0+保存并查看SQLite數(shù)據(jù)庫文件
一. 首先展示一下demo:
代碼在:SQLitedemo

<與上面兩個博客中改善了表中數(shù)據(jù)的顯示>
基本實現(xiàn)了:
數(shù)據(jù)庫的建立;數(shù)據(jù)庫的增刪查改;
二. 主要思路流程:
編寫DatabaseHelper類繼承自SQLiteOpenHelper類;
完成頁面布局,layout;
完成MainAvtivity的編寫,實現(xiàn)對組件的監(jiān)聽和增刪查改;
三. 具體實現(xiàn):
-
我們需要使用的數(shù)據(jù)庫是SQLite,AndroidSDK自帶的數(shù)據(jù)庫。
在使用SQLite之前,我們先簡單了解一下SQLite。SQLite的特點是微型,輕量,占用資源低。
Android 提供的SQLiteOpenHelper.java 是一個抽象類,用來幫助我們實現(xiàn)數(shù)據(jù)庫的操縱。
此時需要在DatabaseHelper類中實現(xiàn)三個方法:構(gòu)造函數(shù),onCreate,onUpgrade。
構(gòu)造函數(shù)//帶全部參數(shù)的構(gòu)造函數(shù),此構(gòu)造函數(shù)必不可少,name為數(shù)據(jù)庫名稱 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); }onCreate
//創(chuàng)建數(shù)據(jù)庫sql語句 并 執(zhí)行,相當于初始化數(shù)據(jù)庫,這里是新建了一張表這個方法繼承自SQLiteOpenHelper,會自動調(diào)用,也就是會 當新建了一個DatabaseHelper對象時,就會默認新建一張表user,表里存著名為name項 public void onCreate(SQLiteDatabase db) { String sql = "create table user(name varchar(20))"; db.execSQL(sql); }onUpgrade
//這里應當實現(xiàn)數(shù)據(jù)庫升級等操作,由于是簡 單demo,所以就不寫了 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } 新建布局文件,這里就不多說了,在下方的查詢結(jié)果顯示是srcollView
-
MainActivity的編寫
獲得按鈕組件;
設(shè)置監(jiān)聽器;
新建數(shù)據(jù)庫;//新建了一個名為test_db的數(shù)據(jù)庫 DatabaseHelper databaseHelper = new DatabaseHelper(this,"test_db",null,1); SQLiteDatabase db = databaseHelper.getWritableDatabase(); -
實現(xiàn)對test_db數(shù)據(jù)庫中user表中數(shù)據(jù)的增刪查改
(引自博客https://blog.csdn.net/midnight_time/article/details/80834198)
① 增:插入數(shù)據(jù),首先需要new一個ContentValues,內(nèi)容值對象。
所謂的內(nèi)容值,就是一個K,V 鍵值對,K指明字段名稱即列名稱,V指明字段值,即單元格內(nèi)容。然后將這個鍵值對放到ContentValues的對象values里面,再把攜帶著鍵值對的對象values插入user表中,代碼如下:case R.id.insert_button: ContentValues values = new ContentValues(); values.put("name",insert_data); db.insert("user",null,values); break;② 刪:刪除數(shù)據(jù),這里不需要生成ContentValues對象,直接從表user中delete符合要求的內(nèi)容即可,代碼如下:
//刪除數(shù)據(jù)按鈕 case R.id.delete_button: db.delete("user","name=?",new String[]{delete_data}); break;③ 改:更新數(shù)據(jù),這里和插入數(shù)據(jù)類似,需要new一個ContentValues對象,然后放入數(shù)據(jù),執(zhí)行update,代碼如下:
case R.id.update_button: ContentValues values2 = new ContentValues(); values2.put("name", update_after_data); db.update("user", values2, "name = ?", new String[]{update_before_data}); break;④ 查:查詢?nèi)繑?shù)據(jù),這里使用了Cursor游標進行查詢,游歷數(shù)據(jù)同時,把數(shù)據(jù)用換行符\n連接起來,再把所有數(shù)據(jù)展示到文本顯示框內(nèi),代碼如下:
//查詢?nèi)繑?shù)據(jù) case R.id.query: //創(chuàng)建游標對象 Cursor cursor = db.query("user", new String[]{"name"}, null, null, null, null, null); //利用游標遍歷所有數(shù)據(jù)對象 //為了顯示全部,把所有對象連接起來,放到TextView中 String textview_data = ""; while(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); textview_data = textview_data + "\n" + name; } textView.setText(textview_data); break;
四、ContentValues的使用
ContentValues 有點想 map,就是一個鍵值對的存儲容器。
ContentValues 和 HashTable類似都是一種存儲的機制 但是兩者最大的區(qū)別就在于,contenvalues只能存儲基本類型的數(shù)據(jù),像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。ContentValues存儲對象的時候,以(key,value)的形式來存儲數(shù)據(jù)。
在往數(shù)據(jù)庫中插入數(shù)據(jù)的時候,首先應該有一個ContentValues的對象所以:
ContentValues initial = new ContentValues();
initial.put(key,values);
SQLiteDataBase db ;
db.insert(TABLE_NAME,null,initialValues);
插入成功就返回記錄的id否則返回-1;
示例代碼:一個簡單的插入
public long insert(String text)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(FIELD_TEXT, text);
long row = db.insert(TABLE_NAME, null, cv);
return row;
}
五、使用sqlite總結(jié)
- SQLiteOpenHelper:抽象類,我們通過繼承該類,然后重寫數(shù)據(jù)庫創(chuàng)建以及更新的方法, 我們還可以通過該類的對象獲得數(shù)據(jù)庫實例,或者關(guān)閉數(shù)據(jù)庫!
SQLiteDatabase:數(shù)據(jù)庫訪問類:我們可以通過該類的對象來對數(shù)據(jù)庫做一些增刪改查的操作
Cursor:游標,有點類似于JDBC里的resultset,結(jié)果集!可以簡單理解為指向數(shù)據(jù)庫中某 一個記錄的指針! - onCreate(database):首次使用軟件時生成數(shù)據(jù)庫表
onUpgrade(database,oldVersion,newVersion):在數(shù)據(jù)庫的版本發(fā)生變化時會被調(diào)用, 一般在軟件升級時才需改變版本號,而數(shù)據(jù)庫的版本是由程序員控制的,假設(shè)數(shù)據(jù)庫現(xiàn)在的 版本是1,由于業(yè)務的變更,修改了數(shù)據(jù)庫表結(jié)構(gòu),這時候就需要升級軟件,升級軟件時希望 更新用戶手機里的數(shù)據(jù)庫表結(jié)構(gòu),為了實現(xiàn)這一目的,可以把原來的數(shù)據(jù)庫版本設(shè)置為2 或者其他與舊版本號不同的數(shù)字即可! - Step 1:自定義一個類繼承SQLiteOpenHelper類
Step 2:在該類的構(gòu)造方法的super中設(shè)置好要創(chuàng)建的數(shù)據(jù)庫名,版本號
Step 3:重寫onCreate( )方法創(chuàng)建表結(jié)構(gòu)
Step 4:重寫onUpgrade( )方法定義版本號發(fā)生改變后執(zhí)行的操作