Android資料存放區之SQLite

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.