最近為了鞏固android基礎(chǔ),復(fù)習(xí)了sqlite數(shù)據(jù)庫這篇。好記性不如爛筆頭,操起鍵盤就是干....
sqlite簡介
SQLite 是一款輕量級的關(guān)系型數(shù)據(jù)庫,它的運算速度非??欤?占用資源很少,通常只需要幾百 K 的內(nèi)存就足夠了,因而特別適合在移動設(shè)備上使用。SQLite 不僅支持標(biāo)準(zhǔn)的 SQL 語法,還遵循了數(shù)據(jù)庫的 ACID 事務(wù),所以只要你以前使用過其他的 關(guān)系型數(shù)據(jù)庫,就可以很快地上手 SQLite。而 SQLite 又比一般的數(shù)據(jù)庫要簡單得多,它甚 至不用設(shè)置用戶名和密碼就可以使用。Android 正是把這個功能極為強大的數(shù)據(jù)庫嵌入到了 系統(tǒng)當(dāng)中,使得本地持久化的功能有了一次質(zhì)的飛躍。
優(yōu)點:
1)零配置,無需安裝和配置
2)儲存在單一磁盤文件中的一個完整數(shù)據(jù)庫
3)數(shù)據(jù)庫文件可以在不同的字節(jié)順序的機器間自由共享
4)支持?jǐn)?shù)據(jù)庫大小至2TB
5)足夠小,全部源代碼大致3萬行C代碼,250k
6)比目前流行的大多數(shù)數(shù)據(jù)庫帶數(shù)據(jù)的操作要快
7)開源
常用的sql基本語句
創(chuàng)建表:
create table 表名 (字段名 數(shù)據(jù)類型,字段名 數(shù)據(jù)類型,字段名 數(shù)據(jù)類型)
插入數(shù)據(jù):
insert into 表名 values(數(shù)據(jù)值,數(shù)據(jù)值,數(shù)據(jù)值)
insert into 表名 (字段1,字段2,字段3) values(數(shù)據(jù)值,數(shù)據(jù)值,數(shù)據(jù)值)
更新數(shù)據(jù):
update 表名 set 字段1 = 數(shù)據(jù)值 where 其他字段 = 數(shù)據(jù)值
刪除數(shù)據(jù):
delete from 表名 where 字段值 = 數(shù)據(jù)值
刪除表:
drop table if exists 表名
增加字段:
alter table 表名 add column 字段 數(shù)據(jù)類型
查詢數(shù)據(jù):
select * from表名 where 查詢的條件表達式 group by 分組的字段 order by 排序的字段
//select 后面為* 則返回所有的字段,返回部分字段,只需把*換成需要的字段,多個字段有逗號隔開
創(chuàng)建數(shù)據(jù)庫
android的為我們提供了SQLiteOpenHelper ,繼承這個抽象類類,需要復(fù)寫構(gòu)造方法(一般選構(gòu)造參數(shù)少的那個),onCreate()和onUpgrade()
onCreate
這個方法是用來創(chuàng)建數(shù)據(jù)庫用的;
onUpgrade
這個方法是用來升級數(shù)據(jù)庫用的;
例子如下:
創(chuàng)建一個學(xué)生表
public class MySQLiteHelp extends SQLiteOpenHelper {
public static final int VERSION = 1;
private static final String DB_NAME = "my_db.db";
private static final String CREATE_BOOK = "create table Students (" +
"id integer primary key autoincrement," +
"name text," +
"class text," +
"year integer," +
"grade real)";
private Context mContext;
public MySQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"創(chuàng)建成功!",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
然后實例化MySQLiteHelp這個類,并調(diào)用getWritableDatabase()方法。
//第一個參數(shù)上下文,第二個參數(shù)數(shù)據(jù)庫名字,第三個參數(shù)允許我們在查詢數(shù)據(jù)的時候返回一個自定義的Cursor,一般傳null,第四個參數(shù)傳入數(shù)據(jù)庫版本
mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,1);
//創(chuàng)建或者打開一個數(shù)據(jù)庫,如果數(shù)據(jù)庫存在就打開,沒有就創(chuàng)建
mySQLiteHelp.getWritableDatabase();
打開File Explorer查看數(shù)據(jù)庫是否創(chuàng)建成功;目錄在data/data/[包名]/databases

這里需要講下 SQLite的數(shù)據(jù)類型和getWritableDatabase()與getReadableDatabase()的區(qū)別
SQLite的數(shù)據(jù)類型只有5種:
1,null(數(shù)據(jù)值為空)
2,integer(整型)
3,real(浮點型數(shù)據(jù))
4,text(字符串,數(shù)據(jù)庫編碼【utf-8,utf-16be或者utf-16le】存放)
5,blob(只是一個數(shù)據(jù)塊,完全按照輸入存放)
getWritableDatabase()與getReadableDatabase()的區(qū)別
getWritableDatabase取得的實例不是僅僅具有寫的功能,而是同時具有讀和寫的功能同樣的;
getReadableDatabase取得的實例也是具對數(shù)據(jù)庫進行讀和寫的功能。
兩者的區(qū)別在于getWritableDatabase取得的實例是以讀寫的方式打開數(shù)據(jù)庫,如果打開的數(shù)據(jù)庫磁盤滿了,此時只能讀不能寫,此時調(diào)用了getWritableDatabase的實例,那么將會發(fā)生錯誤(異常)
getReadableDatabase取得的實例是先調(diào)用getWritableDatabase以讀寫的方式打開數(shù)據(jù)庫,如果數(shù)據(jù)庫的磁盤滿了,此時返回打開失敗,繼而用getReadableDatabase的實例以只讀的方式去打開數(shù)據(jù)庫
操作數(shù)據(jù)庫
操作數(shù)據(jù)庫的類不是SQLiteOpenHelper ,而是SQLiteDatabase,這個對象是通過調(diào)用getWritableDatabase方法返回的對象;
下面來演示下操作數(shù)據(jù)庫的增刪改查
添加數(shù)據(jù)
ps:db 是一個SQLiteDatabase對象;
調(diào)用db.execSQL(String sql)方法;
String sql = "insert into Students (name,class,year,grade) values ('小明','一年級',8,98)";
db.execSQL(sql);
這里我用sqlite expert professional 這個工具打開數(shù)據(jù)庫,查看數(shù)據(jù)是否插入成功

其實SQLiteDatabase還為我們提供了更加簡單的一種方法插入數(shù)據(jù);
調(diào)用 db.insert();
ContentValues values = new ContentValues();
values.put("name","小紅");
values.put("class","一年級");
values.put("year",7);
values.put("grade",100);
db.insert("Students",null,values);

更新數(shù)據(jù)
我們來將小明的分?jǐn)?shù)偷偷的改成100
使用sql語法的如下:
String sql = "update Students set grade = 100 where name = '小明' ";
db.execSQL(sql);

android內(nèi)置語法:
我們來把小明的分?jǐn)?shù)偷偷的改成60
ContentValues values1 = new ContentValues();
values1.put("grade",60);
db.update("Students",values1,"name = ?",new String[]{"小明"});
db.update的方法需要傳入四個參數(shù),第一個是表名,第二個是需要修改的值,第三個是條件,第四個是符合條件的值

刪除數(shù)據(jù)
我們來將小明的數(shù)據(jù)刪除點;
sql語法:
String sql = "delete from Students where name = '小明' ";
db.execSQL(sql);
將小明的數(shù)據(jù)刪除了,這樣他爸媽就不知道了。

android內(nèi)置語法:
//這里三個參數(shù),第一個是表名,第二個是條件,第三個是符合條件的值
db.delete("Students","name = ?",new String[]{"小明"});
查詢數(shù)據(jù)
sql語句:
查詢數(shù)據(jù)這里不能用:db.execSQL(sql),
這里需要換一個方法:db.rawQuery()
String sql1 = "select * from Students where name = '小紅' ";
//第一個參數(shù)為select語句;第二個參數(shù)為select語句中占位符參數(shù)的值,如果select語句沒有使用占位符,該參數(shù)可以設(shè)置為null
Cursor cursor = db.rawQuery(sql1, null);
if (cursor.moveToFirst()){
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String class_ = cursor.getString(cursor.getColumnIndex("class"));
int year = cursor.getInt(cursor.getColumnIndex("year"));
double grade = cursor.getDouble(cursor.getColumnIndex("grade"));
Log.d(TAG, "name: "+name);
Log.d(TAG, "name: "+class_);
Log.d(TAG, "name: "+year);
Log.d(TAG, "name: "+grade);
}while (cursor.moveToNext());
}
cursor.close();
執(zhí)行完查詢語句返回一個Cursor數(shù)據(jù)類型。他是一個提供了隨機讀寫訪問數(shù)據(jù)庫查詢結(jié)果集的接口。Cursor并不是線程安全,因此在多線程中訪問的時候需要手動進行同步,避免線程出現(xiàn)問題。
常用的Cursor函數(shù)有:
close() 關(guān)閉游標(biāo),釋放資源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在緩沖區(qū)中檢索請求的列的文本,將將其存儲
getColumnCount() 返回所有列的總數(shù)
getColumnIndex(String columnName) 返回指定列的名稱,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 從零開始返回指定列名稱,如果不存在將拋出IllegalArgumentException 異常。
getColumnName(int columnIndex) 從給定的索引返回列名
getColumnNames() 返回一個字符串?dāng)?shù)組的列名
getCount() 返回Cursor 中的行數(shù)
moveToFirst() 移動光標(biāo)到第一行
moveToLast() 移動光標(biāo)到最后一行
moveToNext() 移動光標(biāo)到下一行
moveToPosition(int position) 移動光標(biāo)到一個絕對的位置
moveToPrevious() 移動光標(biāo)到上一行
android內(nèi)置語法:
/**
* 第一個參數(shù):表名
* 第二個參數(shù):要查詢的字段名
* 第三個參數(shù):要查詢的條件字段
* 第四個參數(shù):要查詢的條件字段對應(yīng)的值
* 第五個參數(shù):分組的字段
* 第六個參數(shù):篩選的字段
* 第七個參數(shù):排序的字段
* 返回值:游標(biāo)
Cursor cursor = db.query("Students",null,null,null,null,null,null);
*/
獲取了游標(biāo)Cursor 之后的操作與上面一樣。
android的基本操作就這樣了,下次有時候?qū)懸幌聰?shù)據(jù)庫的升級和優(yōu)化部分。等我把github弄好我再吧代碼上傳