日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android SQLite数据库的详细使用

發布時間:2025/4/16 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 startindex

pageSize每頁有多少條數據,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語句,大大提高了開發效率

框架名稱功能描述
OrmLiteJDBC和Android的輕量級ORM java包
Sugar用超級簡單的方法處理Android數據庫
GreenDAO一種輕快地將對象映射到SQLite數據庫的ORM解決方案,使用的App有:薄荷,京東
ActiveAndroid以活動記錄方式為Android SQLite提供持久化
SQLBriteSQLiteOpenHelper 和ContentResolver的輕量級包裝
Realm移動數據庫:一個SQLite和ORM的替換品
android-database-sqlcipher數據庫加密
storioBeautiful 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数据库的详细使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。