摘要:前言數(shù)據(jù)庫操作在開發(fā)中非常常用今天我將帶大家全面了解關(guān)于數(shù)據(jù)庫的操作增刪查改目錄數(shù)據(jù)庫介紹是內(nèi)置的一個(gè)小型關(guān)系型屬于文本型的數(shù)據(jù)庫。提供了對(duì)數(shù)據(jù)庫的完全支持,應(yīng)用程序中的任何類都可以通過名稱來訪問任何的數(shù)據(jù)庫,但是應(yīng)用程序之外的就不能訪問。
前言
SQLite數(shù)據(jù)庫操作在Android開發(fā)中非常常用
今天我將帶大家全面了解關(guān)于SQLite數(shù)據(jù)庫的操作(增、刪、查、改)
目錄 1. SQLite數(shù)據(jù)庫介紹
SQLite是Android內(nèi)置的一個(gè)小型、關(guān)系型、屬于文本型的數(shù)據(jù)庫。
> Android提供了對(duì) SQLite數(shù)據(jù)庫的完全支持,應(yīng)用程序中的任何類都可以通過名稱來訪問任何的數(shù)據(jù)庫,但是應(yīng)用程序之外的就不能訪問。
Android中,通過SQLiteOpenHelper類來實(shí)現(xiàn)對(duì)SQLite數(shù)據(jù)庫的操作。
2. SQLiteOpenHelper類介紹定義:SQLiteOpenHelper是一個(gè)輔助類
作用:管理數(shù)據(jù)庫(創(chuàng)建、增、修、刪) & 版本的控制。
使用過程:通過創(chuàng)建子類繼承SQLiteOpenHelper類,實(shí)現(xiàn)它的一些方法來對(duì)數(shù)據(jù)庫進(jìn)行操作。
> 在實(shí)際開發(fā)中,為了能夠更好的管理和維護(hù)數(shù)據(jù)庫,我們會(huì)封裝一個(gè)繼承自SQLiteOpenHelper類的數(shù)據(jù)庫操作類,然后以這個(gè)類為基礎(chǔ),再封裝我們的業(yè)務(wù)邏輯方法。
SQLiteOpenHelper類的數(shù)據(jù)庫操作方法介紹
方法名 | 作用 | 備注 |
---|---|---|
onCreate() | 創(chuàng)建數(shù)據(jù)庫 | 創(chuàng)建數(shù)據(jù)庫時(shí)自動(dòng)調(diào)用 |
onUpgrade() | 升級(jí)數(shù)據(jù)庫 | |
close() | 關(guān)閉所有打開的數(shù)據(jù)庫對(duì)象 | |
execSQL() | 可進(jìn)行增刪改操作, 不能進(jìn)行查詢操作 | |
query()、rawQuery() | 查詢數(shù)據(jù)庫 | |
insert() | 插入數(shù)據(jù) | |
delete() | 刪除數(shù)據(jù) | |
getWritableDatabase() | 創(chuàng)建或打開可以讀/寫的數(shù)據(jù)庫 | 通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 |
getReadableDatabase() | 創(chuàng)建或打開可讀的數(shù)據(jù)庫 | 同上 |
*
3. 常見數(shù)據(jù)庫使用數(shù)據(jù)庫操作無外乎:“增刪查改”:
對(duì)于“增、刪、改(更新)”這類對(duì)表內(nèi)容變換的操作,需先調(diào)用getWritableDatabase()獲得一個(gè)可寫數(shù)據(jù)庫對(duì)象,在執(zhí)行的時(shí)候調(diào)用通用的execSQL(String sql)或或?qū)?yīng)的操作API方法:insert()、delete()、update()
對(duì)“查”,需要調(diào)用getReadableDatabase()獲得一個(gè)可讀的數(shù)據(jù)庫對(duì)象,然后使用query()或rawQuery()方法
> 查詢數(shù)據(jù)庫**不能使用execSQL方法**
下面我將一一介紹。
3.1 創(chuàng)建數(shù)據(jù)庫涉及的方法有onCreate()、getWritableDatabase()、getReadableDatabase()
具體代碼如下:
> 假設(shè)DatabaseHelper類是SQLiteOpenHelper的子類
DatabaseHelper.java
//第一次創(chuàng)建數(shù)據(jù)庫的時(shí)候回調(diào)該方法 //當(dāng)使用getReadableDatabase()方法獲取數(shù)據(jù)庫實(shí)例的時(shí)候, 如果數(shù)據(jù)庫不存在, 就會(huì)調(diào)用這個(gè)方法; //作用:創(chuàng)建數(shù)據(jù)庫表:將創(chuàng)建數(shù)據(jù)庫表的 execSQL()方法 和 初始化表數(shù)據(jù)的一些 insert()方法寫在里面; @Override public void onCreate(SQLiteDatabase db) { //SQLite數(shù)據(jù)創(chuàng)建支持的數(shù)據(jù)類型: 整型數(shù)據(jù),字符串類型,日期類型,二進(jìn)制的數(shù)據(jù)類型 //創(chuàng)建了一個(gè)名為person的表 String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))"; //execSQL用于執(zhí)行SQL語句 //完成數(shù)據(jù)庫的創(chuàng)建 db.execSQL(sql); //數(shù)據(jù)庫實(shí)際上是沒有被創(chuàng)建或者打開的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一個(gè)被調(diào)用時(shí)才會(huì)進(jìn)行創(chuàng)建或者打開 //見下代碼
MainActivity.java
// 創(chuàng)建DatabaseHelper對(duì)象 // 只執(zhí)行這句話是不會(huì)創(chuàng)建或打開連接的 SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson"); // 調(diào)用getReadableDatabase()或getWritableDatabase()才算真正創(chuàng)建或打開數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); //SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase() ;3.2 插入數(shù)據(jù)
步驟:創(chuàng)建并打開數(shù)據(jù)庫(可讀/寫)、插入數(shù)據(jù)
涉及方法:getWritableDatabase()、insert()
> insert()也可以使用excelSQL()代替
具體代碼如下:
//1. 創(chuàng)建并打開數(shù)據(jù)庫 // 創(chuàng)建DatabaseHelper對(duì)象(記得傳入最新版本的數(shù)據(jù)庫) // 只執(zhí)行這句話是不會(huì)創(chuàng)建或打開連接的 //注意,一定要傳入最新的數(shù)據(jù)庫版本號(hào) SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 //通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); //2. 創(chuàng)建并打開數(shù)據(jù)庫 // 創(chuàng)建ContentValues對(duì)象 ContentValues values = new ContentValues(); // 向該對(duì)象中插入鍵值對(duì) values.put("id", 1); values.put("name", "yangyz"); //其中,key代表列名,value代表該列要插入的值 //注:ContentValues內(nèi)部實(shí)現(xiàn)就是HashMap,但是兩者還是有差別的 //ContenValues Key只能是String類型,Value只能存儲(chǔ)基本類型數(shù)據(jù),不能存儲(chǔ)對(duì)象 // 調(diào)用insert()方法將數(shù)據(jù)插入到數(shù)據(jù)庫當(dāng)中 sqliteDatabase.insert("user", null, values); // 第一個(gè)參數(shù):要操作的表名稱 // 第二個(gè)參數(shù):SQl不允許一個(gè)空列,如果ContentValues是空的,那么這一列被明確的指明為NULL值 // 第三個(gè)參數(shù):ContentValues對(duì)象 ////db.execSQL("insert into user (id,name) values (1,"張三")") 也可以 }3.3 修改數(shù)據(jù)(升級(jí)數(shù)據(jù)庫)
涉及的方法有onUpgrade()、getWritableDatabase()、update()
具體代碼如下:
DatabaseHelper.java
//數(shù)據(jù)庫版本號(hào) private static final int DATABASE_VERSION = 1; //作用:更新數(shù)據(jù)庫表結(jié)構(gòu) //調(diào)用時(shí)機(jī):數(shù)據(jù)庫版本發(fā)生變化的時(shí)候回調(diào)(取決于數(shù)據(jù)庫版本) // 創(chuàng)建SQLiteOpenHelper子類對(duì)象的時(shí)候,必須傳入一個(gè)version參數(shù) //該參數(shù)就是當(dāng)前數(shù)據(jù)庫版本, 只要這個(gè)版本高于之前的版本, 就會(huì)觸發(fā)這個(gè)onUpgrade()方法,如下面代碼 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //使用SQL的ALTER語句 String sql = "alter table person add sex varchar(8)"; db.execSQL(sql); } //參數(shù)說明: // db : 數(shù)據(jù)庫 //oldVersion : 舊版本數(shù)據(jù)庫 //newVersion : 新版本數(shù)據(jù)庫 //注意:這里的刪除等操作必須要保證新的版本必須要比舊版本的版本號(hào)要大才行。[即 Version 2.0 > Version 1.0 ] 所以這邊我們不需要對(duì)其進(jìn)行操作。
MainActivity.java
// 創(chuàng)建一個(gè)DatabaseHelper對(duì)象 // 創(chuàng)建SQLiteOpenHelper子類對(duì)象的時(shí)候,必須傳入一個(gè)version參數(shù) //該參數(shù)就是當(dāng)前數(shù)據(jù)庫版本, 只要這個(gè)版本高于之前的版本, 就會(huì)觸發(fā)這個(gè)onUpgrade()方法,如下面代碼 ////注意,一定要傳入最新的數(shù)據(jù)庫版本號(hào) // 傳入版本號(hào)為2,大于舊版本(1),所以會(huì)調(diào)用onUpgrade()升級(jí)數(shù)據(jù)庫 DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson", 2); // 調(diào)用getWritableDatabase()得到一個(gè)可寫的SQLiteDatabase對(duì)象 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); // 創(chuàng)建一個(gè)ContentValues對(duì)象 ContentValues values = new ContentValues(); values.put("name", "zhangsan"); // 調(diào)用update方法修改數(shù)據(jù)庫 sqliteDatabase.update("user", values, "id=?", new String[] { "1" }); // 第一個(gè)參數(shù)String:表名 // 第二個(gè)參數(shù)ContentValues:ContentValues對(duì)象(需要修改的) // 第三個(gè)參數(shù)String:WHERE表達(dá)式,where選擇語句, 選擇那些行進(jìn)行數(shù)據(jù)的更新, 如果該參數(shù)為 null, 就會(huì)修改所有行;?號(hào)是占位符 // 第四個(gè)參數(shù)String[]:where選擇語句的參數(shù), 逐個(gè)替換 whereClause 中的占位符;3.4 刪除數(shù)據(jù)
步驟:創(chuàng)建并打開數(shù)據(jù)庫(可讀/寫)、刪除數(shù)據(jù)
涉及方法:getWritableDatabase()、delete()
> delete()也可以使用excelSQL()代替
具體代碼如下:
//1. 創(chuàng)建并打開數(shù)據(jù)庫 // 創(chuàng)建DatabaseHelper對(duì)象 // 只執(zhí)行這句話是不會(huì)創(chuàng)建或打開連接的 ////注意,一定要傳入最新的數(shù)據(jù)庫版本號(hào) SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 //通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); //2. 刪除數(shù)據(jù) //調(diào)用delete方法進(jìn)行刪除操作 sqliteDatabase.delete("user", "id=?", new String[]{"1"}); //第一個(gè)參數(shù)String:需要操作的表名 //第二個(gè)參數(shù)String:where選擇語句, 選擇哪些行要被刪除, 如果為null, 就刪除所有行; //第三個(gè)參數(shù)String[]: where語句的參數(shù), 逐個(gè)替換where語句中的 "?" 占位符;3.5 查詢數(shù)據(jù)
步驟:創(chuàng)建并打開數(shù)據(jù)庫(可讀)、查詢數(shù)據(jù)
涉及方法:getReadableDatabase()、query() 或 rawQuery(),介紹如下:
//第一種最為簡單 //將所有的SQL語句都組織到一個(gè)字符串中,使用占位符代替實(shí)際參數(shù)(selectionArgs) db.rawQuery(String sql, String[] selectionArgs); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); //參數(shù)說明 //table:要操作的表明 //columns:查詢的列所有名稱集 //selection:WHERE之后的條件語句,可以使用占位符 //groupBy:指定分組的列名 //having指定分組條件,配合groupBy使用 //orderBy指定排序的列名 //limit指定分頁參數(shù) //distinct可以指定“true”或“false”表示要不要過濾重復(fù)值 //所有方法將返回一個(gè)Cursor對(duì)象,代表數(shù)據(jù)集的游標(biāo) //Cursor對(duì)象常用方法如下: c.move(int offset); //以當(dāng)前位置為參考,移動(dòng)到指定行 c.moveToFirst(); //移動(dòng)到第一行 c.moveToLast(); //移動(dòng)到最后一行 c.moveToPosition(int position); //移動(dòng)到指定行 c.moveToPrevious(); //移動(dòng)到前一行 c.moveToNext(); //移動(dòng)到下一行 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);//返回某列名對(duì)應(yīng)的列索引值 c.getString(int columnIndex); //返回當(dāng)前行指定列的值
具體代碼如下:
//1. 創(chuàng)建并打開數(shù)據(jù)庫 // 創(chuàng)建DatabaseHelper對(duì)象 // 只執(zhí)行這句話是不會(huì)創(chuàng)建或打開連接的 ////注意,一定要傳入最新的數(shù)據(jù)庫版本號(hào) SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson",2); // 調(diào)用getReadableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 //通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); //2. 查詢數(shù)據(jù) // 調(diào)用SQLiteDatabase對(duì)象的query方法進(jìn)行查詢 // 返回一個(gè)Cursor對(duì)象:由數(shù)據(jù)庫查詢返回的結(jié)果集對(duì)象 Cursor cursor = sqliteDatabase.query("user", new String[] { "id", "name" }, "id=?", new String[] { "1" }, null, null, null); // 第一個(gè)參數(shù)String:表名 // 第二個(gè)參數(shù)String[]:要查詢的列名 // 第三個(gè)參數(shù)String:查詢條件 // 第四個(gè)參數(shù)String[]:查詢條件的參數(shù) // 第五個(gè)參數(shù)String:對(duì)查詢的結(jié)果進(jìn)行分組 // 第六個(gè)參數(shù)String:對(duì)分組的結(jié)果進(jìn)行限制 // 第七個(gè)參數(shù)String:對(duì)查詢的結(jié)果進(jìn)行排序 // 將光標(biāo)移動(dòng)到下一行,從而判斷該結(jié)果集是否還有下一條數(shù)據(jù) //如果有則返回true,沒有則返回false while (cursor.moveToNext()) { id = cursor.getString(cursor.getColumnIndex("id")); name = cursor.getString(cursor.getColumnIndex("name")); } //也可將Cursor中的數(shù)據(jù)轉(zhuǎn)為 ArrayList3.6 關(guān)閉數(shù)據(jù)庫
當(dāng)我們完成了對(duì)數(shù)據(jù)庫的操作后,記得調(diào)用SQLiteDatabase的close()方法釋放數(shù)據(jù)庫連接,否則容易出現(xiàn)SQLiteException。
SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson"); // 調(diào)用getReadableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 //通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); //關(guān)閉當(dāng)前數(shù)據(jù)庫 sqliteDatabase.close();3.7 刪除數(shù)據(jù)庫
SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this, "test_carson"); // 調(diào)用getReadableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 //通過返回的SQLiteDatabase對(duì)象對(duì)數(shù)據(jù)庫進(jìn)行操作 SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); //刪除名為test.db數(shù)據(jù)庫 deleteDatabase("test.db");特別注意
其實(shí)對(duì)于上述所有的數(shù)據(jù)庫操作(除了“查詢”),我們都可以使用下列方法代替:
db.executeSQL(String sql); db.executeSQL(String sql, Object[] bindArgs); //sql語句中使用占位符,然后第二個(gè)參數(shù)是實(shí)際的參數(shù)集
個(gè)人建議都使用SQL語句,因?yàn)椋?/p>
SQL語句較為通用;
使用insert()、delete()、query()方法具備多個(gè)參數(shù),使用復(fù)雜
4. 實(shí)例DemoDemo描述:創(chuàng)建數(shù)據(jù)庫并對(duì)數(shù)據(jù)庫進(jìn)行操作(增、刪、查、改)
實(shí)現(xiàn)步驟:
實(shí)現(xiàn)子類繼承SQLiteOpenHelper類(復(fù)寫onCreat()、onUpgrade())
在MainActivity里實(shí)現(xiàn)需要進(jìn)行的數(shù)據(jù)庫操作(增、刪、查、改)
4.1 具體代碼如下:建議先下載Demo再進(jìn)行閱讀:Carson的Github:DataBase_Demo
步驟1:實(shí)現(xiàn)子類繼承SQLiteOpenHelper類(復(fù)寫onCreat()、onUpgrade())
MySQLiteOpenHelper.java
package scut.carson_ho.database_demo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MySQLiteOpenHelper extends SQLiteOpenHelper { //數(shù)據(jù)庫版本號(hào) private static Integer Version = 1; //在SQLiteOpenHelper的子類當(dāng)中,必須有該構(gòu)造函數(shù) public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { //必須通過super調(diào)用父類當(dāng)中的構(gòu)造函數(shù) super(context, name, factory, version); } //參數(shù)說明 //context:上下文對(duì)象 //name:數(shù)據(jù)庫名稱 //param:factory //version:當(dāng)前數(shù)據(jù)庫的版本,值必須是整數(shù)并且是遞增的狀態(tài) public MySQLiteOpenHelper(Context context,String name,int version) { this(context,name,null,version); } public MySQLiteOpenHelper(Context context,String name) { this(context, name, Version); } //當(dāng)數(shù)據(jù)庫創(chuàng)建的時(shí)候被調(diào)用 @Override public void onCreate(SQLiteDatabase db) { System.out.println("創(chuàng)建數(shù)據(jù)庫和表"); //創(chuàng)建了數(shù)據(jù)庫并創(chuàng)建一個(gè)叫records的表 //SQLite數(shù)據(jù)創(chuàng)建支持的數(shù)據(jù)類型: 整型數(shù)據(jù),字符串類型,日期類型,二進(jìn)制的數(shù)據(jù)類型 String sql = "create table user(id int primary key,name varchar(200))"; //execSQL用于執(zhí)行SQL語句 //完成數(shù)據(jù)庫的創(chuàng)建 db.execSQL(sql); //數(shù)據(jù)庫實(shí)際上是沒有被創(chuàng)建或者打開的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一個(gè)被調(diào)用時(shí)才會(huì)進(jìn)行創(chuàng)建或者打開 } //數(shù)據(jù)庫升級(jí)時(shí)調(diào)用 //如果DATABASE_VERSION值被改為2,系統(tǒng)發(fā)現(xiàn)現(xiàn)有數(shù)據(jù)庫版本不同,即會(huì)調(diào)用onUpgrade()方法 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("更新數(shù)據(jù)庫版本為:"+newVersion); } }
步驟2:在MainActivity里實(shí)現(xiàn)需要進(jìn)行的數(shù)據(jù)庫操作(增、刪、查、改)
MainActivity.java
package scut.carson_ho.database_demo; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button instablish; private Button insert; private Button upgrade; private Button modify; private Button delete; private Button query; private Button delete_database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //綁定按鈕 instablish = (Button) findViewById(R.id.instablish); insert = (Button) findViewById(R.id.insert); upgrade = (Button) findViewById(R.id.upgrade); modify = (Button) findViewById(R.id.modify); delete = (Button) findViewById(R.id.delete); query = (Button) findViewById(R.id.query); delete_database = (Button) findViewById(R.id.delete_database); //設(shè)置監(jiān)聽器 instablish.setOnClickListener(this); insert.setOnClickListener(this); upgrade.setOnClickListener(this); modify.setOnClickListener(this); delete.setOnClickListener(this); query.setOnClickListener(this); delete_database.setOnClickListener(this); } //設(shè)置每個(gè)按鈕對(duì)數(shù)據(jù)庫的操作進(jìn)行控制 @Override public void onClick(View v) { switch (v.getId()) { //點(diǎn)擊創(chuàng)建數(shù)據(jù)庫庫 case R.id.instablish: // 創(chuàng)建SQLiteOpenHelper子類對(duì)象 MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(this,"test_carson"); //數(shù)據(jù)庫實(shí)際上是沒有被創(chuàng)建或者打開的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一個(gè)被調(diào)用時(shí)才會(huì)進(jìn)行創(chuàng)建或者打開 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); // SQLiteDatabase sqliteDatabase = dbHelper.getReadbleDatabase(); break; //點(diǎn)擊更新數(shù)據(jù) case R.id.upgrade: // 創(chuàng)建SQLiteOpenHelper子類對(duì)象 MySQLiteOpenHelper dbHelper_upgrade = new MySQLiteOpenHelper(this,"test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase_upgrade = dbHelper_upgrade.getWritableDatabase(); // SQLiteDatabase sqliteDatabase = dbHelper.getReadbleDatabase(); break; //點(diǎn)擊插入數(shù)據(jù)到數(shù)據(jù)庫 case R.id.insert: System.out.println("插入數(shù)據(jù)"); // 創(chuàng)建SQLiteOpenHelper子類對(duì)象 ////注意,一定要傳入最新的數(shù)據(jù)庫版本號(hào) MySQLiteOpenHelper dbHelper1 = new MySQLiteOpenHelper(this,"test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase1 = dbHelper1.getWritableDatabase(); // 創(chuàng)建ContentValues對(duì)象 ContentValues values1 = new ContentValues(); // 向該對(duì)象中插入鍵值對(duì) values1.put("id", 1); values1.put("name", "carson"); // 調(diào)用insert()方法將數(shù)據(jù)插入到數(shù)據(jù)庫當(dāng)中 sqliteDatabase1.insert("user", null, values1); // sqliteDatabase.execSQL("insert into user (id,name) values (1,"carson")"); //關(guān)閉數(shù)據(jù)庫 sqliteDatabase1.close(); break; //點(diǎn)擊查詢數(shù)據(jù)庫 case R.id.query: System.out.println("查詢數(shù)據(jù)"); // 創(chuàng)建DatabaseHelper對(duì)象 MySQLiteOpenHelper dbHelper4 = new MySQLiteOpenHelper(MainActivity.this,"test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase4 = dbHelper4.getReadableDatabase(); // 調(diào)用SQLiteDatabase對(duì)象的query方法進(jìn)行查詢 // 返回一個(gè)Cursor對(duì)象:由數(shù)據(jù)庫查詢返回的結(jié)果集對(duì)象 Cursor cursor = sqliteDatabase4.query("user", new String[] { "id", "name" }, "id=?", new String[] { "1" }, null, null, null); String id = null; String name = null; //將光標(biāo)移動(dòng)到下一行,從而判斷該結(jié)果集是否還有下一條數(shù)據(jù) //如果有則返回true,沒有則返回false while (cursor.moveToNext()) { id = cursor.getString(cursor.getColumnIndex("id")); name = cursor.getString(cursor.getColumnIndex("name")); //輸出查詢結(jié)果 System.out.println("查詢到的數(shù)據(jù)是:"+"id: "+id+" "+"name: "+name); } //關(guān)閉數(shù)據(jù)庫 sqliteDatabase4.close(); break; //點(diǎn)擊修改數(shù)據(jù) case R.id.modify: System.out.println("修改數(shù)據(jù)"); // 創(chuàng)建一個(gè)DatabaseHelper對(duì)象 // 將數(shù)據(jù)庫的版本升級(jí)為2 // 傳入版本號(hào)為2,大于舊版本(1),所以會(huì)調(diào)用onUpgrade()升級(jí)數(shù)據(jù)庫 MySQLiteOpenHelper dbHelper2 = new MySQLiteOpenHelper(MainActivity.this,"test_carson", 2); // 調(diào)用getWritableDatabase()得到一個(gè)可寫的SQLiteDatabase對(duì)象 SQLiteDatabase sqliteDatabase2 = dbHelper2.getWritableDatabase(); // 創(chuàng)建一個(gè)ContentValues對(duì)象 ContentValues values2 = new ContentValues(); values2.put("name", "zhangsan"); // 調(diào)用update方法修改數(shù)據(jù)庫 sqliteDatabase2.update("user", values2, "id=?", new String[]{"1"}); //關(guān)閉數(shù)據(jù)庫 sqliteDatabase2.close(); break; //點(diǎn)擊刪除數(shù)據(jù) case R.id.delete: System.out.println("刪除數(shù)據(jù)"); // 創(chuàng)建DatabaseHelper對(duì)象 MySQLiteOpenHelper dbHelper3 = new MySQLiteOpenHelper(MainActivity.this,"test_carson",2); // 調(diào)用getWritableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase3 = dbHelper3.getWritableDatabase(); //刪除數(shù)據(jù) sqliteDatabase3.delete("user", "id=?", new String[]{"1"}); //關(guān)閉數(shù)據(jù)庫 sqliteDatabase3.close(); break; //點(diǎn)擊刪除數(shù)據(jù)庫 case R.id.delete_database: System.out.println("刪除數(shù)據(jù)庫"); MySQLiteOpenHelper dbHelper5 = new MySQLiteOpenHelper(MainActivity.this, "test_carson",2); // 調(diào)用getReadableDatabase()方法創(chuàng)建或打開一個(gè)可以讀的數(shù)據(jù)庫 SQLiteDatabase sqliteDatabase5 = dbHelper5.getReadableDatabase(); //刪除名為test.db數(shù)據(jù)庫 deleteDatabase("test_carson"); break; default: break; } } }
步驟3:在主布局文件設(shè)置按鈕控制數(shù)據(jù)庫的操作
activity_main.xml
4.2 測試結(jié)果
界面顯示
按順序點(diǎn)擊:創(chuàng)建 - 更新 - 插入 - 查詢 - 修改 - 查詢 - 刪除數(shù)據(jù)
4.3 Demo下載地址DataBase_Demo
5. 總結(jié)通過閱讀本文,你將全面了解Android SQLite數(shù)據(jù)庫中的所有操作
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70581.html
閱讀 2928·2021-11-04 16:06
閱讀 767·2021-09-30 09:56
閱讀 1832·2021-09-22 10:02
閱讀 2612·2019-08-29 13:43
閱讀 2198·2019-08-29 13:42
閱讀 2288·2019-08-29 12:21
閱讀 1038·2019-08-29 11:29
閱讀 1377·2019-08-26 13:51