Android SQLite数据库的详细使用
SQLite 簡介
SQLite 是一款內置到移動設備上的輕量型的數據庫,是遵守ACID(原子性、一致性、隔離性、持久性)的關聯式數據庫管理系統,多用于嵌入式系統中
SQLite 數據庫是無類型的,可以向一個integer 的列中添加一個字符串,但它又支持常見的類型比如:NULL,VARCHAR, TEXT,INTEGER,BLOB,CLOB 等
Android 系統內置了SQLite,并提供了一系列API 方便對其進行操作。
1. 使用SQLiteOpenHelper 創建數據庫
SQLiteOpenHelper 是Android 提供的一個抽象工具類,負責管理數據庫的創建、升級工作。如果我們想創建數據庫,就需要自定義一個類繼承SQLiteOpenHelper,然后覆寫其中的抽象方法。
| getWritableDatabase() | 打開可讀寫的數據庫,沒有權限或磁盤已滿時會拋異常 |
| getReadableDatabase() | 在磁盤空間不足時打開只讀數據庫,否則打開可讀寫數據庫;有異常時返回一個只讀數據庫 |
創建的數據庫位于:/data/data/包名/databases/目錄中
1.1 自定義SQLiteOpenHelper
public class MySQLiteOpenHelper extends SQLiteOpenHelper {private static final String DB_NAME = "user.db";private static final int VERSION = 1;public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}public MySQLiteOpenHelper(Context context) {super(context, DB_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {//數據庫創建db.execSQL("create table person (_id integer primary key autoincrement, " +"name char(10), phone char(20), money integer(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//數據庫升級}@Overridepublic void onOpen(SQLiteDatabase db) {super.onOpen(db);} }注意:上面的代碼我們只是定義了一個MySQLiteOpenHelper 類繼承了SQLiteOpenHelper 類。在onCreate()方法中通過執行sql 語句實現表的創建。
2. 數據庫的增刪改查
2.1 SQLiteDatabase
| execSQL() | 執行SQL語句實現增刪改查 |
| Cursor rawQuery() | 執行sql查詢語句 |
| insert() | 插入 |
| delete() | 刪除 |
| update() | 更新 |
| query() | 查詢 |
| beginTransaction() | 開始事務 |
| setTransactionSuccessful() | 設置事務成功 |
| endTransaction() | 結束事務 |
2.2 執行SQL語句實現增刪改查
insert into person (name, phone, money) values ('張三', '159874611', 2000);//插入 delete from person where name = '李四' and _id = 4;//刪除 update person set money = 6000 where name = '李四';//更新 select name, phone from person where name = '張三';//查詢 alter table t_user add c_money float;//升級 create table t_user(uid integer primary key not null,c_name varchar(20),c_age integer,c_phone varchar(20))";//創建 db.execSQL("insert into person (name, phone, money) values (?, ?, ?);", new Object[]{"張三", 15987461, 75000}); Cursor cursor = db.rawQuery("select _id, name, money from person where name = ?;", new String[]{"張三"});2.3 使用api實現增刪改查
插入
//以鍵值對的形式保存要存入數據庫的數據 ContentValues cv = new ContentValues(); cv.put("name", "劉能"); cv.put("phone", 1651646); cv.put("money", 3500); //返回值是改行的主鍵,如果出錯返回-1 long i = db.insert("person", null, cv);nullColumnHack:當ContentValues為空的時候,會將nullColumnHack 作為“NULL”的屬性,幾乎用不到,一般為null
修改
ContentValues cv = new ContentValues(); cv.put("money", 25000); int i = db.update("person", cv, "name = ?", new String[]{"趙四"});刪除
//返回值是刪除的行數 int i = db.delete("person", "_id = ? and name = ?", new String[]{"1", "張三"});查詢
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);| table | 表名 |
| columns | 查詢的字段 |
| selection | 查詢條件 |
| selectionArgs | 填充查詢條件的占位符,條件中?對應的值 |
| groupBy | 分組查詢參數 |
| having | 分組查詢條件 |
| orderBy | 排序字段和規則,“字段名 desc/asc” |
| limit | 分頁查詢,“m,n”,m表示從第幾條開始查,n表示一個查詢多少條數據 |
limit分頁查詢
select * from blacknumber limit pagesize offset startindexpageSize每頁有多少條數據,startIndex 從哪條數據開始
3. Cursor
| moveToNext() | 游標移動到下一行位置 |
| moveToFirst() | 游標移動到第一行位置 |
| moveToPrevious() | 游標移動到前一行位置 |
| moveToLast() | 游標移動到最后一行位置 |
| getXxx() | 獲取列的值,如:getInt(),getString() |
| getColumnIndex() | 獲取列索引 |
| getColumnNames() | 獲取所有字段名字 |
| getCount() | 獲取游標的記錄行數 |
4. CursorFactory
游標工廠,創建游標
5. SQL語句
- insert into person (name, phone, money) values (‘張三’, ‘159874611’, 2000);
- delete from person where name = ‘李四’ and _id = 4;
- update person set money = 6000 where name = ‘李四’;
- select name, phone from person where name = ‘張三’;
6. ContentValues
ContentValues values = new ContentValues(); values.put("name", "lisi"); values.clear();7. 事務Transaction
在SQLiteDatabase 提供了對事務的支持,處于事務中的操作都是“臨時性”的,只有事務提交了才會將數據保存到數據庫。
事務的使用不僅可以保證數據的一致性,也可以提高批處理時的執行效率。
SQLiteDatabase 提供的beginTransaction()打開事務,endTransaction()結束事務。注意:結束事務并不代表事務提交,如果想讓數據寫入的數據庫需要在結束事務前執行setTransactionSuccessful()方法。這是事務提交的唯一方式。
使用事務會大大提高批量處理的效率
try {//開啟事務db.beginTransaction();...........//設置事務執行成功db.setTransactionSuccessful(); } finally{//關閉事務//如果此時已經設置事務執行成功,則sql語句生效,否則不生效db.endTransaction(); }8. 兩種SQLiteDatabase 的不同
SQLiteOpenHelper 有兩個方法均可返回SQLiteDatabase 對象:
- getWritableDatabase()
該方法返回的對象和另外一個方法返回的對象沒有任何差異,返回的對象對數據庫都可以進行讀、寫操作,當磁盤已滿或者權限不足的情況下該方法會拋出異常。
- getReadableDatabase()
跟另外一個方法相比,在磁盤已滿的情況下,該方法不會拋出異常,而是返回一個只讀的數據庫操作對象。根據這兩種方法返回對象的差異,如果需要對數據庫進行查詢操作則推薦使用后者,如果添加、修改、刪除數據則推薦使用前者。
9. SQLite優化
- 事務機制Transaction
- 建表優化
- 索引
- 不要關聯多表查詢,減少鏈接時間,創建索引、將查詢到的數據采用緩存策略等
10. sqlite3 工具的使用
sqlite3 是Android 內置的操作數據庫工具,使用該工具可以直接對SQLite 數據庫進行操作。操作步驟:
- 在命令行界面使用adb shell 命令進入linux 內核
- 使用cd 命令進入數據庫所在目錄(數據庫的路徑為”/data/data/應用包名/databases/數據庫”)
- 使用”sqlite3 數據庫名”進入數據庫操作模式
11. DAO模式
11.1 Dao接口
定義操作數據庫的增刪改查抽象方法,insert(),delete(),update(),select()
11.2 DaoImpl
Dao接口的實現類
11.3 DBUtil
11.4 SQLiteOpenHelper
SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
創建數據庫
onCreate(SQLiteDatabase db)
升級數據庫
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
12. ORM框架
ORM是Object Relation Mapping的簡稱,即對象關系映射,說人話就是用面向對象的編程思想去操作數據庫,調用一個方法即可完成數據庫的增刪改查操作,不用寫繁瑣的SQL語句,大大提高了開發效率
| OrmLite | JDBC和Android的輕量級ORM java包 |
| Sugar | 用超級簡單的方法處理Android數據庫 |
| GreenDAO | 一種輕快地將對象映射到SQLite數據庫的ORM解決方案,使用的App有:薄荷,京東 |
| ActiveAndroid | 以活動記錄方式為Android SQLite提供持久化 |
| SQLBrite | SQLiteOpenHelper 和ContentResolver的輕量級包裝 |
| Realm | 移動數據庫:一個SQLite和ORM的替換品 |
| android-database-sqlcipher | 數據庫加密 |
| storio | Beautiful API for SQLiteDatabase and ContentResolver |
| realm-java | 高性能數據庫,Realm is a mobile database: a replacement for SQLite & ORMs |
13. SQLite3中自增主鍵歸零方法
當SQLite數據庫中包含自增列時,會自動建立一個名為 sqlite_sequence 的表。這個表包含兩個列:name和seq。name記錄自增列所在的表,seq記錄當前序號(下一條記錄的編號就是當前序號加1)。如果想把某個自增列的序號歸零,只需要修改 sqlite_sequence表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';<!--也可以直接把該記錄刪掉--> DELETE FROM sqlite_sequence WHERE name='TableName';<!--要想將所有表的自增列都歸零,直接清空sqlite_sequence表就可以了--> DELETE FROM sqlite_sequence;14. 擴展閱讀
SQLite教程
性能優化之數據庫優化
Android數據庫高手秘籍
Android數據存儲與持久化
MySQL數據庫:SQL語句
MySQL數據庫:完整性約束
總結
以上是生活随笔為你收集整理的Android SQLite数据库的详细使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android全屏沉浸式应用
- 下一篇: Android数据存储与持久化