Android開發_SQLite數據庫

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();
	}
}

發佈了46 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章