SQLite
輕量級數據庫,主要用於嵌入式系統,只占幾百K系統資源
具有如下特性:
輕量性:只需要一個動態庫,就可以享受全部功能,而且動態庫尺寸也很小
獨立性:核心引擎不需要依賴第三方軟件
隔離性:數據庫所有信息(表、視圖、觸發器)都放在同一個文件裡
跨平台:支持大部分操作系統,也可以在PC端使用
安全性:獨占性和共享鎖來實現事務處理,支持多進程讀取數據,只能一個進程修改
有五種常用數據類型:
NULL:空值
INTEGER:整形
REAL:浮點型
VARCHAR:字符型
BLOB:大數據
注意:SQLite不支持BOOLEAN和DATE,因此可以用0,1代替BOOLEAN(其它數據庫也經常這麼干)
INTEGER或VARCHAR代替DATE,更多參考資料http://www.sqlite.org/
在Android系統中提供了android.database.sqlite包,用於進行SQLite數據庫的增、刪、改、查工作。其主要方法如下:
1、創建數據庫連接
1 // 創建數據庫的兩種方法,推薦第一種,第二種使用絕對路徑,較繁雜
2 SQLiteDatabase db = this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null);
3 SQLiteDatabase db2 = SQLiteDatabase.openOrCreateDatabase("/data/data/com.example.sqlite/databases/test_db2.db", null);
創建完/data/data/com.example.sqlite/databases/ 會有兩個數據庫文件。
2、創建tab表,有兩個字段_id和name,其中_id為自增序列,name不為空。
1 // 創建tab表
2 db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
3、插入數據
復制代碼
1 //插入數據
2 // 類似map,鍵值對存儲數據
3 ContentValues values = new ContentValues();
4 for (int i = 0; i < 5; i++) {
5 values.put("name", "test"+i);
6 // 插入到數據庫,參數:表名, 指定表中的某列列名,數據
7 db.insert("tab", "_id", values);
8 }
復制代碼
4、修改數據
復制代碼
1 // 修改
2 ContentValues values2 =new ContentValues();
3 values2.put("name", "name");
4 // 更改數據,參數分別:表名、新數據、where條件、子句(可為null)
5 db.update("tab", values2, "_id=1", null);
6 // where條件?為占位符,最後一個參數可替換占位符
7 db.update("tab", values2, "_id=?", new String[]{"10"});
復制代碼
將數據庫文件拷貝到本地電腦可以用 SQLite Expert Personal 3查看,修改後_id為0和10的name列 值都改掉了。
由於我程序執行了4次,多插入3遍,因此有20條記錄。
5、查詢數據
復制代碼
1 //查詢數據兩種方法query、rawQuery
2 // Cursor指游標,學過數據庫的都知道吧,後面跟一系列參數,目標表名、where子句、order by子句、having子句等可不記,用第二種方法
3 Cursor c = db.query("tab", null, null, null, null, null, null);
4 // 在第一次讀取Cursor對象中的數據時,一定要先移動游標,否則此游標的位置在第一條記錄之前,會引發異常
5 c.moveToFirst();
6 while(!c.isAfterLast()){
7 int index = c.getColumnIndex("name");
8 Log.d("SQLite", c.getString(index));
9 c.moveToNext();
10 }
11
12 //推薦用這種,不需記那麼多參數
13 c = db.rawQuery("select * from tab", null);
14 c.moveToFirst();
15 while(!c.isAfterLast()){
16 int index = c.getColumnIndex("name");
17 Log.d("SQLite", c.getString(index));
18 c.moveToNext();
19 }
復制代碼
日子打印結果:
針對游標的常用方法說明:
6、刪除數據和關閉連接
1 // 刪除數據
2 db.delete("tab", "_id=? or name=?", new String[]{"8", "test0"});
3
4 // 關閉數據庫連接,釋放資源
5 db.close();
實際開發是繼承數據庫的輔助類SQLiteOpenHelper來方便操作的,主要做的工作就是重寫以下兩個方法:
onCreate(SQLiteDatabase db) : 當數據庫被首次創建時執行該方法,一般將創建表等初始化操作在該方法中執行。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):當打開數據庫時傳入的版本號與當前的版本號不同時會調用該方法。
除了上述兩個必須要實現的方法外,還可以選擇性地實現onOpen 方法,該方法會在每次打開數據庫時被調用。
一般的代碼結構:
復制代碼
1 public class DatabaseHelper extends SQLiteOpenHelper {
2
3 private static final String DB_NAME = "mydata.db"; //數據庫名稱
4 private static final int version = 1; //數據庫版本
5
6 public DatabaseHelper(Context context) {
7 super(context, DB_NAME, null, version);
8 // TODO Auto-generated constructor stub
9 }
10
11 @Override
12 public void onCreate(SQLiteDatabase db) {
13 String sql = "create table user(username varchar(20) not null , password varchar(60) not null );";
14 db.execSQL(sql);
15 }
16
17 @Override
18 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
19 // TODO Auto-generated method stub
20
21 }
22
23 }