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