SQLite數據庫簡介
SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎。它支持大多數的SQL92標準,並且可以在所有主要的操作系統上運行。
SQLite由以下幾個部分組成:SQL編譯器、內核、後端以及附件。SQLite通過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展SQLite的內核變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機中執行的程序集。
SQLite可以支持高達2TB大小的數據庫,每個數據庫都是以單個文件的形式存在,這些數據都是以B-Tree的數據結構形式存儲在磁盤上。
在事務處理方面,SQLite通過數據庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味着多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程想數據庫執行寫操作之前,必須獲得獨佔鎖。在獲得獨佔鎖之後,其他的讀或寫操作將不會再發生。
SQLite採用動態數據類型,當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作爲本身的類型存儲,SQLite稱這爲“弱類型”。但有一個特例,如果是INTEGER PRIMARY KEY,則其他類型不會被轉換,會報一個“datatype missmatch”的錯誤。
概括來講,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數據類型,分別代表空值、整型值、浮點值、字符串文本、二進制對象。
SQLite存儲的位置:/data/data/package/databases/database-name
Android中SQLite數據庫的使用
在android中提供可一個 創建數據庫的輔助類SQLiteOpenHelper,通常我們自定義一個類來繼承它
public class MyDB extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; // 數據庫名稱
private static final int version = 1; // 數據庫版本
public MyDB(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE user(name VARCHAR 20 NOT NULL,age INT PRIMARY KEY AUTOINCREMENT");
}
@Override
public void onUpgrade(SQLiteDatabase db, int ov, int nv) {
}
}
其中onCreate方法會在數據庫第一次創建時由系統調用,而onUpgrade方法會在數據庫更新時由系統調用。數據庫的創建
可以通過調用了SQLiteOpenHelper類的getReadableDatabase()方法或getWritableDatabase()方法來創建數據庫對象
其中getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。
getReadableDatabase()方法則是先以讀寫方式打開數據庫,如果數據庫的磁盤空間滿了,就會打開失敗,當打開失敗後會繼續嘗試以只讀方式打開數據庫。如果該問題成功解決,則只讀數據庫對象就會關閉,然後返回一個可讀寫的數據庫對象。
MyDB db = new MyDB(this);
SQLiteDatabase db1 = db.getWritableDatabase();
SQLiteDatabase db2 = db.getReadableDatabase();
常用的操作方法
1、插入數據:(long) insert(String table,String nullColumnHack,ContentValues values)
2、刪除數據:(int) delete(String table,String whereClause,String[] whereArgs)
3、更新數據:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
4、查詢數據:(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
5、執行一個SQL語句:(void) execSQL(String sql)
6、運行一個預置的SQL語句,返回帶遊標的數據集:(Cursor) rawQuery(String sql, String[] selectionArgs)
Cursor遊標常用的方法
1、getCount() 總記錄條數
2、isFirst() 判斷是否第一條記錄
3、isLast() 判斷是否最後一條記錄
4、moveToFirst() 移動到第一條記錄
5、moveToLast() 移動到最後一條記錄
6、move(int offset) 移動到指定的記錄
7、moveToNext() 移動到嚇一條記錄
8、moveToPrevious() 移動到上一條記錄
9、getColumnIndex(String columnName) 獲得指定列索引的int類型值
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDB db = new MyDB(this);
SQLiteDatabase sdbw = db.getWritableDatabase();
// 向數據庫中插入數據
ContentValues cv = new ContentValues();
cv.put("name", "aaa");
cv.put("age", "20");
sdbw.insert("user", null, cv);
sdbw.close();
// 讀取數據
SQLiteDatabase sdbr = db.getReadableDatabase();
Cursor c = sdbr.query("user", null, null, null, null, null, null);
while (c.moveToNext()) {
String name = c.getString(c.getColumnIndex("name"));
int age = c.getInt(c.getColumnIndex("age"));
System.out.println("name=" + name + ",age=" + age);
}
sdbr.close();
}
}