SQLite數(shù)據(jù)庫
Sqlite簡介
Sqlite是一款輕型的數(shù)據(jù)庫响蕴,它包含在一個相對小的C庫中谆焊,它的設計目標是嵌入式的,由于它占用資源非常少浦夷,可能只需要幾百K的內存就可以了辖试,并且支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時可以和很多種程序語言相結合劈狐,比如:C#/Java/php等罐孝,所以在嵌入式設備中特別受歡迎,這一點也正好符合android的開發(fā)要求肥缔,所以在Android開發(fā)中經(jīng)常要用到該數(shù)據(jù)庫莲兢。SQlite內部結構
在內部,Sqlite有以下幾個組件組成:SQL編譯器、內核改艇、后端以及附件收班。Sqlite通過利用虛擬機和虛擬數(shù)據(jù)庫引擎,是調試谒兄、修改和擴展Sqlite的內核變得更加方便摔桦,所有SQL語句被編譯成易讀的、可以在Sqlite虛擬機中執(zhí)行的程序集承疲。-
android中Sqlite的使用方法
在Android中要想使用Sqlite數(shù)據(jù)庫酣溃,首先應該創(chuàng)建一個類繼承SQLiteOpenHelper類,我們把這個類命名為DatabaseHelper纪隙,它作為一個訪問Sqlite的助手類赊豌,提供了兩方面的功能:- getReadableDatabase()/getWritableDatabase()可以獲得SQLiteDatabase對象,通過該對象可以對數(shù)據(jù)庫進行操作绵咱;
- 提供OnCreate()和onUpgrade()兩個回調函數(shù)碘饼,允許我們在創(chuàng)建和升級數(shù)據(jù)庫時,進行自己的操作悲伶;
范例:
- 數(shù)據(jù)庫助手類
- 自定義MySQLiteOpenHelper類 繼承SQLiteOpenHelper
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
// 數(shù)據(jù)庫文件名
private final static String DB_NAME = "my_database.db";
// 數(shù)據(jù)庫版本號
private final static int DB_VERSION = 1;
// 數(shù)據(jù)庫表名
public final static String TABLE_NAME = "table_person";
/**
* 創(chuàng)建數(shù)據(jù)庫文件
*
* @param context 上下文
* @param name 數(shù)據(jù)庫文件名
* @param factory 游標工廠, 如果為null,Android系統(tǒng)提供默認的游標
* @param version 數(shù)據(jù)庫版本號
*/
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//創(chuàng)建數(shù)據(jù)庫文件:
public MySQLiteOpenHelper(Context context) {
//創(chuàng)建了名為"my_database.db"數(shù)據(jù)庫,版本號 1 數(shù)據(jù)庫地址: data/data/com.w.Demo/databases/my_database.db
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 創(chuàng)建了數(shù)據(jù)庫
* @param db 系統(tǒng)返回的數(shù)據(jù)庫對象
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 創(chuàng)建表語句艾恼,語義:如果不存在則創(chuàng)建表,字段包括:主鍵_id麸锉,name钠绍,age
/*注意: SQ語句: exists后面空格,()不要忘記*/
String sql = "create table if not exists " + TABLE_NAME + "(_id integer primary key autoincrement, name varchar, age integer)";
// 執(zhí)行創(chuàng)建表的數(shù)據(jù)庫語句
db.execSQL(sql);
}
/**
* @param db 系統(tǒng)返回的數(shù)據(jù)庫對象
* @param oldVersion 舊版本
* @param newVersion 新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion != newVersion) {
Log.d("TAG", "onUpgrade: onUpgrade");
}
}
}
- 使用數(shù)據(jù)助手類創(chuàng)建數(shù)據(jù)庫
MySQLiteOpenHelper mHelper = new MySQLiteOpenHelper(this);
SQLiteDatabase dbSelect = mHelper.getReadableDatabase();
具體增刪改查見下:
創(chuàng)建或打開數(shù)據(jù)庫的方法
public SQLiteDatabase getDb() {
//創(chuàng)建數(shù)據(jù)庫 my_database.db
String filePath = Environment.getExternalStorageDirectory() + "/my_database.db";
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(filePath, null);
//在數(shù)據(jù)庫中創(chuàng)建一張表 table_person
String sql = "create table if not exists table_person(_id integer primary key autoincrement, name varchar, age integer)";
// 執(zhí)行創(chuàng)建表的數(shù)據(jù)庫語句
database.execSQL(sql);
return database;
}
-
插入數(shù)據(jù)
- 插入單條數(shù)據(jù)
SQLiteDatabase dbAdd = getDb();
ContentValues values = new ContentValues();
values.put("name", "林志玲");
values.put("age", 18);
// table:要插入數(shù)據(jù)的表名
//nullColumnHack:當插入數(shù)據(jù)為null時,nullColumnHack不允許為空花沉,通過系統(tǒng)的處理保證了程序的穩(wěn)定性柳爽;當插入數(shù)據(jù)不為null時,nullColumnHack排不上用場碱屁,為null
// values:插入的數(shù)據(jù)
dbAdd.insert("table_person", null, values);
- 使用SQ語句插入多條數(shù)據(jù)
//得到數(shù)據(jù)庫
SQLiteDatabase dbAdd = getDb();
// 開始事務
dbAdd.beginTransaction();
try {
for (int i = 0; i < 10; i++) {
// 插入數(shù)據(jù)
String sql = "insert into table_person(name, age) values('林志玲', " + i + ")";
dbAdd.execSQL(sql);
}
//事務成功
dbAdd.setTransactionSuccessful();
} catch (Exception e) {
} finally {
//結束事務
dbAdd.endTransaction();
}
//關閉數(shù)據(jù)庫,節(jié)約內存資源
dbAdd.close();
Transaction事務: 事務開始和結束之間的代碼要嗎全部執(zhí)行要么不執(zhí)行
刪除數(shù)據(jù)
SQLiteDatabase dbDelete = getDb();
// 刪除數(shù)據(jù)庫指定表中的數(shù)據(jù)
// table:表名
// whereClause:刪除條件磷脯,格式“name = ?”
// whereArgs:滿足刪除的條件,即刪除的數(shù)據(jù)娩脾,格式“"張三"”
dbDelete.delete("table_person", "name = ?", new String[]{"林志玲"});
dbDelete.close();
- 修改數(shù)據(jù)
ContentValues contentValues = new ContentValues();
contentValues.put("name", "張三");
contentValues.put("age", 25);
SQLiteDatabase dbModify = getDb();
// table:表名
// values:更新的數(shù)據(jù)
// whereClause:更新條件
// whereArgs:滿足更新的條件
dbModify.update("table_person", contentValues, "name = ?", new String[]{"林志玲"});
dbModify.close();
- 查詢數(shù)據(jù)
//得到數(shù)據(jù)庫;
SQLiteDatabase dbSelect = getDb();
// 查詢數(shù)據(jù)庫
// table:表名
// columns:被查詢的列(字段)赵誓,可以有很多個
// selection:查詢條件
// selectionArgs:滿足查詢的條件
// groupBy:指定分組(多數(shù)情況不使用)
// having:分組篩選數(shù)據(jù)關鍵字(多數(shù)情況不使用)
// orderBy:排序
Cursor cursor = dbSelect.query("table_person", new String[]{"name", "age"}, null, null, null, null, null);
int nameIndex = cursor.getColumnIndex("name");
int ageIndex = cursor.getColumnIndex("age");
//遍歷數(shù)據(jù)庫查詢數(shù)據(jù)
while (cursor.moveToNext()) {
String name = cursor.getString(nameIndex);
int age = cursor.getInt(ageIndex);
showText = showText + "姓名: " + name + "\t年齡: " + age + "\n";
}
Log.d("TAG", "數(shù)據(jù): " + showText );
dbSelect.close();
cursor.close();
-注意事項:
- 若使用自定義的數(shù)據(jù)庫助手類創(chuàng)建了數(shù)據(jù)庫,數(shù)據(jù)庫存儲的位置為** data/data/com.w.Demo/databases/my_database.db**
- 若使用創(chuàng)建或打開數(shù)據(jù)庫的方法,數(shù)據(jù)庫的位置為:/storage/emulated/0/my_database.db