標籤:android style blog http io os ar 使用 java
SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,佔用資源非常少,只有幾百KB記憶體。支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟其他程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源的世界著名資料庫管理系統來講,它的處理速度比他們都快。SQLite是當前使用最廣泛的資料庫,基於以上優點,Android系統採用SQLite資料庫。
SQLiteOpenHelper介紹
Android應用程式為了對資料庫進行管理,提供了一個抽象類別SQLiteOpenHelper,SQLiteOpenHelper類提供了兩個重要的方法,分別是 onCreate()和 onUpgrade(),onCreate用於初次使用軟體時產生資料庫表,onUpgrade用於升級軟體時更新資料庫表結構。
當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法擷取用於操作資料庫的SQLiteDatabase執行個體的時候,如果資料庫不存在,Android系統會自動產生一個資料庫,接著調用onCreate()方法。onCreate()方法在初次產生資料庫時才會被調用,在onCreate()方法裡可以產生資料庫表結構及添加一些應用使用到的初始化資料。
onUpgrade()方法在資料庫的版本發生變化時會被調用,一般在軟體升級時才需改變版本號碼,而資料庫的版本是由程式員控制的。
假設現在的版本是1,升級軟體時希望更新使用者手機裡的資料庫表結構,為了實現這一目的,可以把原來的資料庫版本設定為2,並且在onUpgrade()方法裡面實現表結構的更新。當軟體的版本升級次數比較多,這時在onUpgrade()方法裡面可以根據原版號和目標版本號碼進行判斷,然後做出相應的表結構及資料更新。
Demo的實現
先來看一個頁面:
布局就不用寫了,就是四個按鈕,實現的目的就是在產生Person資料庫,同時產生一個表,然後操作Person中的資料:
首先需要重寫一下抽象類別SQLiteOpenHelper中的方法
public class MySQLDBHelper extends SQLiteOpenHelper {private static final String DBname="Person.db";private staticfinal int version=1;private String tag="MySQLDBHelper";public MySQLDBHelper(Context context) {super(context, DBname, null, version);Log.i(tag, "測試");}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubLog.i(tag, "Person資料庫中Person建立前");String sqlString="create table Person (id integer primary key autoincrement,Name nvarchar(200),Address nvarchar(200))";db.execSQL(sqlString);Log.i(tag, "Person資料庫中Person建立成功");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubLog.i(tag, "更新資料庫,暫時不需要使用");}}
建構函式中的資料庫名稱和版本號碼都是自己可以固定一下,測試就沒有傳那麼多參數,,多說一下這個@Override:
@Override是虛擬碼,表示重寫(當然不寫也可以),不過寫上有兩點好處:
1、可以當注釋用,方便閱讀;
2、編譯器可以給你驗證@Override下面的方法名是否是你父類中所有的,如果沒有則報錯。例如,你如果沒寫@Override,而你下面的方法名寫錯了,這時你的編譯器是可以編譯通過的,因為編譯器以為這個方法是你的子類中自己增加的方法。
插入資料調用,這裡擷取SQLiteDatabase,讓後把拼接好的sql直接傳入執行就OK了:
public void insert(View view) {SQLiteDatabase database = dbhelper.getWritableDatabase();String sql = "insert into Person values(NULL,?,?)";database.execSQL(sql, new Object[] { "FlyElephant", "北京" });Log.i(tag, "插入成功");}
更新資料,這裡注意一下ContentValues的使用,索引值對的順序:
public void update(View view) {SQLiteDatabase database = dbhelper.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("Address", "深圳");database.update("Person", contentValues, "Name=?",new String[] { "FlyElephant" });Log.i(tag, "更新成功");}
查詢資料,這裡用到了遊標,類似於C#中SqlDataReader的使用,moveToNext可以滿足基本需求:
public void query(View view) {SQLiteDatabase database = dbhelper.getReadableDatabase();Cursor cursor = database.rawQuery("select * from Person", null);if (cursor.getCount()>0) {while (cursor.moveToNext()) {String nameString = cursor.getString(cursor.getColumnIndex("Name"));String addreString = cursor.getString(cursor.getColumnIndex("Address"));Log.i(tag, "Name:" + nameString + "--Address:" + addreString);}}else {Log.i(tag, "沒有資料");}cursor.close();}
如果你覺得moveToNext()不能滿足需求,我就從網上找了一下別人貼的代碼,如下:
c.move(int offset);//以當前位置為參考,移動到指定行c.moveToFirst();//移動到第一行c.moveToLast();//移動到最後一行c.moveToPosition(int position);//移動到指定行c.moveToPrevious();//移動到前一行c.moveToNext();//移動到下一行c.isFirst();//是否指向第一條c.isLast();//是否指向最後一條c.isBeforeFirst();//是否指向第一條之前c.isAfterLast();//是否指向最後一條之後c.isNull(int columnIndex);//指定列是否為空白(列基數為0)c.isClosed();//遊標是否已關閉c.getCount();//總資料項目數c.getPosition();//返回當前遊標所指向的行數c.getColumnIndex(String columnName);//返回某列名對應的列索引值c.getString(int columnIndex);//返回當前行指定列的值
刪除資料:
public void delete(View v) {SQLiteDatabase database = dbhelper.getReadableDatabase();database.delete("Person", "Name=?", new String[] { "FlyElephant" });Log.i(tag, "刪除成功");}
可以看下結果:
周末又過完了,希望大家明天上班都精精神神的,開開心心的,醉在周末~
Android資料存放區之SQLite