SQLite介紹
SQLite是一款輕量級的關(guān)系型數(shù)據(jù)庫,它的運(yùn)算速度非???,占用資源很少,通常只需要幾百K的內(nèi)存就足夠了,因而特別適合在移動(dòng)設(shè)備上使用。SQLite采用的是動(dòng)態(tài)數(shù)據(jù)類型,會根據(jù)存入值自動(dòng)判斷,具有以下五種常用的數(shù)據(jù)類型:
NULL 值是一個(gè) NULL 值。
INTEGER 值是一個(gè)帶符號的整數(shù),根據(jù)值的大小存儲在 1、2、3、4、6 或 8 字節(jié)中。
REAL 值是一個(gè)浮點(diǎn)值,存儲為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字。
TEXT 值是一個(gè)文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
BLOB 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲。
SQLiteOpenHelper類
是 Android平臺提供給我們一個(gè)數(shù)據(jù)庫輔助類來創(chuàng)建或打開數(shù)據(jù)庫,一般先繼承這個(gè)類的實(shí)現(xiàn)相應(yīng)的方法。再用該類的對象獲取Database執(zhí)行增刪查改的操作。默認(rèn)打開/data/data/package/databases/應(yīng)用里的內(nèi)部數(shù)據(jù)庫執(zhí)行管理。
- onCreate(SQLiteDatabase db) : 當(dāng)數(shù)據(jù)庫被首次創(chuàng)建時(shí)執(zhí)行該方法,一般將創(chuàng)建表等初始化操作在該方法中執(zhí)行。
- onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):當(dāng)打開數(shù)據(jù)庫時(shí)傳入的版本號與當(dāng)前的版本號不同時(shí)會調(diào)用該方法。
public class JsonDbHelper extends SQLiteOpenHelper {
private static final String TAG = "JsonDbHelper";
private static final String DB_NAME = "json_db";//數(shù)據(jù)庫名字
public static String TABLE_NAME = "json";// 表名
public static String FIELD_ID = "id";//
public static String FIELD_NAME = "name";// 接口名
public static String FIELD_TIME = "time";// 加載時(shí)間
public static String FIELD_CONTENT = "content";// 接口內(nèi)容
private static final int DB_VERSION = 1; // 數(shù)據(jù)庫版本
private static JsonDbHelper instance;
public static JsonDbHelper getHelper(Context context) {
if (instance == null)
instance = new JsonDbHelper(context);
return instance;
}
private JsonDbHelper(@Nullable Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//創(chuàng)建表 SQL語句
//CREATE TABLE IF NOT EXISTS `runoob_tbl`(
// `runoob_id` INT UNSIGNED AUTO_INCREMENT,
// `runoob_title` VARCHAR(100) NOT NULL,
// `runoob_author` VARCHAR(40) NOT NULL,
// `submission_date` DATE,
// PRIMARY KEY ( `runoob_id` )
//)ENGINE=InnoDB DEFAULT CHARSET=utf8;
//SQLite采用的是動(dòng)態(tài)數(shù)據(jù)類型,會根據(jù)存入值自動(dòng)判斷,具有以下五種常用的數(shù)據(jù)類型
//NULL 值是一個(gè) NULL 值。
//INTEGER 值是一個(gè)帶符號的整數(shù),根據(jù)值的大小存儲在 1、2、3、4、6 或 8 字節(jié)中。
//REAL 值是一個(gè)浮點(diǎn)值,存儲為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字。
//TEXT 值是一個(gè)文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
//BLOB 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲。
String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
+ FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
+ FIELD_NAME + " TEXT NOT NULL , "
+ FIELD_TIME + " INTEGER NOT NULL , "
+ FIELD_CONTENT + " TEXT NOT NULL);";
try {
db.execSQL(sql);
} catch (SQLException e) {
Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//鏈接:https://juejin.im/post/59e7e5856fb9a0451542fb19
//構(gòu)建刪除表的SQL
String sql = "DROP TABLE IF EXISTS " + DB_NAME;
// 將原來的表和數(shù)據(jù)直接刪除,然后再創(chuàng)建新的表,這是一種比較暴力而簡單
db.execSQL(sql);
onCreate(db);
// 逐步升級的方案 較慢
// if (newVersion > 1) {
//
// }
// if (newVersion > 2) {
//
// }
}
}
SQLiteDatabase類
SQLiteOpenHelper的實(shí)現(xiàn)類的對象調(diào)用 getWritableDatabase(),getReadableDatabase()返回的實(shí)例就是這個(gè)類的實(shí)例。也可以通過SQLiteDatabase的靜態(tài)方法返回實(shí)例:
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);
插入數(shù)據(jù)
- SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
參數(shù)1 表名稱,
參數(shù)2 空列的默認(rèn)值
參數(shù)3 ContentValues類型的一個(gè)封裝了列名稱和列值的Map;
private void insert(SQLiteDatabase db)
{
// 實(shí)例化常量值
ContentValues cValue = new ContentValues();
// 添加用戶名
cValue.put("sname","xiaoming");
// 添加密碼
cValue.put("snumber","01005");
// 調(diào)用insert()方法插入數(shù)據(jù)
db.insert("stu_table",null,cValue);
}
- 編寫插入數(shù)據(jù)的SQL語句,直接調(diào)用SQLiteDatabase的execSQL()方法來執(zhí)行
private void insert(SQLiteDatabase db)
{
//插入數(shù)據(jù)SQL語句
String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";
//執(zhí)行SQL語句
db.execSQL(sql);
}
刪除數(shù)據(jù)
- 調(diào)用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
參數(shù)1 表名稱
參數(shù)2 刪除條件
參數(shù)3 刪除條件值數(shù)組
private void delete(SQLiteDatabase db)
{
// 刪除條件
String whereClause = "id=?";
// 刪除條件參數(shù)
String[] whereArgs = {String.valueOf(2)};
// 執(zhí)行刪除
db.delete("stu_table",whereClause,whereArgs);
}
- 編寫刪除SQL語句,調(diào)用SQLiteDatabase的execSQL()方法來執(zhí)行刪除
private void delete(SQLiteDatabase db)
{
// 刪除SQL語句
String sql = "delete from stu_table where _id = 6";
// 執(zhí)行SQL語句
db.execSQL(sql);
}
修改數(shù)據(jù)
- 調(diào)用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
參數(shù)1 表名稱
參數(shù)2 跟行列ContentValues類型的鍵值對Key-Value
參數(shù)3 更新條件(where字句)
參數(shù)4 更新條件數(shù)組
private void update(SQLiteDatabase db)
{
// 實(shí)例化內(nèi)容值
ContentValues values = new ContentValues();
// 在values中添加內(nèi)容
values.put("snumber","101003");
// 修改條件
String whereClause = "id=?";
// 修改添加參數(shù)
String[] whereArgs={String.valuesOf(1)};
// 修改
db.update("usertable",values,whereClause,whereArgs);
}
- 編寫更新的SQL語句,調(diào)用SQLiteDatabase的execSQL執(zhí)行更新
private void update(SQLiteDatabase db)
{
// 修改SQL語句
String sql = "update stu_table set snumber = 654321 where id = 1";
// 執(zhí)行SQL
db.execSQL(sql);
}
查詢數(shù)據(jù)
- 在Android中查詢數(shù)據(jù)是通過Cursor類來實(shí)現(xiàn)的,當(dāng)我們使用SQLiteDatabase.query()方法時(shí),會得到一個(gè)Cursor對象,Cursor指向的就是每一條數(shù)據(jù)。它提供了很多有關(guān)查詢的方法,具體方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各個(gè)參數(shù)的意義說明:
參數(shù)table:表名稱
參數(shù)columns:列名稱數(shù)組
參數(shù)selection:條件字句,相當(dāng)于where
參數(shù)selectionArgs:條件字句,參數(shù)數(shù)組
參數(shù)groupBy:分組列
參數(shù)having:分組條件
參數(shù)orderBy:排序列
參數(shù)limit:分頁查詢限制
- 編寫查詢的SQL語句,獲取Cursor 對象
Cursor cursor = database.rawQuery("SELECT * FROM " + JsonDbHelper.TABLE_NAME + " WHERE " + JsonDbHelper.FIELD_NAME + "=?"
, new String[]{name});
Cursor:返回值,相當(dāng)于結(jié)果集ResultSet
Cursor是一個(gè)游標(biāo)接口,提供了遍歷查詢結(jié)果的方法,如移動(dòng)指針方法move(),獲得列值方法getString()等.
Cursor游標(biāo)常用方法
getCount() 獲得總的數(shù)據(jù)項(xiàng)數(shù)
isFirst() 判斷是否第一條記錄
isLast() 判斷是否最后一條記錄
moveToFirst() 移動(dòng)到第一條記錄
moveToLast() 移動(dòng)到最后一條記錄
move(int offset) 移動(dòng)到指定記錄
moveToNext() 移動(dòng)到下一條記錄
moveToPrevious() 移動(dòng)到上一條記錄
getColumnIndexOrThrow(String columnName) 根據(jù)列名稱獲得列索引
getInt(int columnIndex) 獲得指定列索引的int類型值
getString(int columnIndex) 獲得指定列縮影的String類型值
示例:查詢數(shù)據(jù)
private void query(SQLiteDatabase db)
{
// 查詢獲得游標(biāo)
Cursor cursor = db.query ("usertable",null,null,null,null,null,null);
// 判斷游標(biāo)是否為空
if(cursor.moveToFirst()
{
// 遍歷游標(biāo)
for(int i=0;i<cursor.getCount();i++)
{
cursor.move(i);
// 獲得ID
int id = cursor.getInt(0);
// 獲得用戶名
String username=cursor.getString(1);
// 獲得密碼
String password=cursor.getString(2);
// 輸出用戶信息
System.out.println(id+":"+sname+":"+snumber);
}
}
}