Android——使用SQLiteDatabase操作SQLite資料庫

來源:互聯網
上載者:User

Android——使用SQLiteDatabase操作SQLite資料庫
除了可以使用檔案或SharedPreferences儲存資料,還可以選擇使用SQLite資料庫儲存資料。在Android平台上,整合了一個嵌入式關係型資料庫—SQLite,SQLite3支援 NULL、INTEGER、REAL(浮點數字)、TEXT(字串文本)和BLOB(二進位對象)資料類型,雖然它支援的類型只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等資料類型,只不過在運算或儲存時會轉成對應的五種資料類型。 SQLite最大的特點是你可以把各種類型的資料儲存到任何欄位中,而不用關心欄位聲明的資料類型是什麼。例如:可以在Integer類型的欄位中存放字串,或者在布爾型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能儲存64位整數, 當向這種欄位儲存除整數以外的資料時,將會產生錯誤。 另外, SQLite 在解析CREATE TABLE 語句時,會忽略 CREATE TABLE 語句中跟在欄位名後面的資料類型資訊,如下面語句會忽略 name欄位的類型資訊:CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))SQLite可以解析大部分標準SQL語句,如:查詢語句:select * from 表名 where 條件子句 group by 分組字句 having ... order by 排序子句如:select * from person select * from person order by id desc select name from person group by name having count(*)>1分頁SQL與mysql類似,下面SQL語句擷取5條記錄,跳過前面3條記錄select * from Account limit 5 offset 3 或者 select * from Account limit 3,5插入語句:insert into 表名(欄位列表) values(值列表)。如: insert into person(name, age) values(‘傳智’,3)更新語句:update 表名 set 欄位名=值 where 條件子句。如:update person set name=‘傳智‘ where id=10刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10l我們在編寫資料庫應用軟體時,需要考慮這樣的問題:因為我們開發的軟體可能會安裝在很多使用者的手機上,如果應用使用到了SQLite資料庫,我們必須在使用者初次使用軟體時建立出應用使用到的資料庫表結構及添加一些初始化記錄,另外在軟體升級的時候,也需要對資料表結構進行更新。那麼,我們如何才能實現在使用者初次使用或升級軟體時自動在使用者的手機上建立出應用需要的資料庫表呢?總不能讓我們在每個需要安裝此軟體的手機上通過手工方式建立資料庫表吧?因為這種需求是每個資料庫應用都要面臨的,所以在Android系統,為我們提供了一個名為SQLiteOpenHelper的抽象類別,必須繼承它才能使用,它是通過對資料庫版本進行管理來實現前面提出的需求。為了實現對資料庫版本進行管理,SQLiteOpenHelper類提供了兩個重要的方法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用於初次使用軟體時產生資料庫表,後者用於升級軟體時更新資料庫表結構。當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法擷取用於操作資料庫的SQLiteDatabase執行個體的時候,如果資料庫不存在,Android系統會自動產生一個資料庫,接著調用onCreate()方法,onCreate()方法在初次產生資料庫時才會被調用,在onCreate()方法裡可以產生資料庫表結構及添加一些應用使用到的初始化資料。onUpgrade()方法在資料庫的版本發生變化時會被調用,一般在軟體升級時才需改變版本號碼,而資料庫的版本是由程式員控制的,假設資料庫現在的版本是1,由於業務的變更,修改了資料庫表結構,這時候就需要升級軟體,升級軟體時希望更新使用者手機裡的資料庫表結構,為了實現這一目的,可以把原來的資料庫版本設定為2(有同學問設定為3行不行?當然可以,如果你願意,設定為100也行),並且在onUpgrade()方法裡面實現表結構的更新。當軟體的版本升級次數比較多,這時在onUpgrade()方法裡面可以根據原版號和目標版本號碼進行判斷,然後作出相應的表結構及資料更新。getWritableDatabase()和getReadableDatabase()方法都可以擷取一個用於操作資料庫的SQLiteDatabase執行個體。但getWritableDatabase() 方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式開啟資料庫,如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以唯讀方式開啟資料庫。lpublic class DatabaseHelper extends SQLiteOpenHelper { //類沒有執行個體化,是不能用作父類構造器的參數,必須聲明為靜態 private static final String name = "itcast"; //資料庫名稱 private static final int version = 1; //資料庫版本 public DatabaseHelper(Context context) {//第三個參數CursorFactory指定在執行查詢時獲得一個遊標執行個體的工廠類,設定為null,代表使用系統預設的工廠類 super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS person"); onCreate(db); }}上面onUpgrade()方法在資料庫版本每次發生變化時都會把使用者手機上的資料庫表刪除,然後再重新建立。一般在實際項目中是不能這樣做的,正確的做法是在更新資料庫表結構時,還要考慮使用者存放於資料庫中的資料不會丟失。l



================================================================================== /**

* @author Administrator yangchao

*為了實現對資料庫版本進行管理,SQLiteOpenHelper類提供了兩個重要的方法,

*分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

*/

public class DBOpenHelper extends SQLiteOpenHelper

{

private static final String DatabaseName = "test.db";//資料庫的名稱

private static final int DatabaseVersion = 1;//資料庫的版本號碼

public DBOpenHelper(Context context)

{

super(context, DatabaseName, null, DatabaseVersion);

}

/*

* 用於初次使用軟體時產生資料庫表

*/

@Override

public void onCreate(SQLiteDatabase db)

{

db.execSQL("CREATE TABLE person (personId integer primary key autoincrement, name varchar(20))");

}

/*

* 用於升級軟體時更新資料庫表結構。

* 只有在資料庫版本發生改變時 才會被調用

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

}

}

------------------------------------------------------------------------------------------------------------------------------------

public class PersonService

{

DBOpenHelper dbOpenHelper;

public PersonService(){}

public PersonService(Context context)

{

this.dbOpenHelper = new DBOpenHelper(context);

}

/**

* 儲存方法

* @param person

*/

public void save(Person person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "insert into person(personId, name) values(?, ?)";

database.execSQL(sql, new Object[]{person.getPersonId(), person.getName()});

}

/**

* 更改方法

* @param person

*/

public void update(Person person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "update person set name=? where personId=?";

database.execSQL(sql, new Object[]{person.getName(), person.getPersonId()});

}

/**

* 刪除方法

* @param person

*/

public void delete(Person person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "delete from person where personId=?";

database.execSQL(sql, new Object[]{person.getPersonId()});

}

/**

* 尋找單個記錄

* @param id

* @return

*/

public Person find(Integer id)

{

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select * from person where personId = ?";

Cursor cursor = database.rawQuery(sql, new String[]{id.toString()});

if(cursor.moveToFirst())

{

String name = cursor.getString(cursor.getColumnIndex("name"));

int personId = cursor.getInt(cursor.getColumnIndex("personId"));

return new Person(personId, name);

}

return null;

}

/**

* 分頁尋找

* @param offset

* @param maxResult

* @return

*/

public List getScrollData(Integer offset, Integer maxResult)

{

List persons = new ArrayList();

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select * from person limit ?, ?";

Cursor cursor = database.rawQuery(sql, new String[]{offset.toString(), maxResult.toString()});

while(cursor.moveToNext())

{

int personId = cursor.getInt(cursor.getColumnIndex("personId"));

String name = cursor.getString(cursor.getColumnIndex("name"));

persons.add(new Person(personId, name) );

}

return persons;

}

/**

* 擷取總記錄數

* @return

*/

public long getCount()

{

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select count(*) from person";

Cursor cursor = database.rawQuery(sql, null);

cursor.moveToFirst();

return cursor.getLong(0);

}

}

====================================測試======================================

public class DBTest extends AndroidTestCase

{

private static final String TAG = "DBTest";

public void testCreateDB()

{

DBOpenHelper helper = new DBOpenHelper(this.getContext());

/*

* 當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法擷取

* 用於操作資料庫的SQLiteDatabase執行個體的時候,如果資料庫不存在,Android系統會自動產生一個資料庫,

* 接著調用onCreate()方法

*/

helper.getWritableDatabase();

}

public void testSava() throws Exception

{

PersonService service = new PersonService(this.getContext());

service.save(new Person(1, "楊超"));

service.save(new Person(2, "楊超1"));

service.save(new Person(3, "楊超2"));

}

public void testDelete()

{

}

public void testFind()

{

PersonService service = new PersonService(this.getContext());

Person person = service.find(4);

Log.i(TAG, person.toString());

}

public void testFenye()

{

}

public void testCount()

{

}

}







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.