Android開發系列(九):建立資料庫以及完成簡單的CRUD操作

來源:互聯網
上載者:User

Android開發系列(九):建立資料庫以及完成簡單的CRUD操作

本篇博文主要實現簡單的建立資料庫以及實現CRUD操作。

首先,我們建立一個Android Project,命名為db


一、完成資料庫的建立操作:

用SQLiteOpenHelper類中的getWritableDatabase()和getReadableDatabase()都可以擷取一個操作資料庫的SQLiteDatabase執行個體,其中getReadableDatabase()方法中會調用getWritableDatabase()方法。

區別:其中,getWritableDatabase() 方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法則是先以讀寫方式開啟資料庫,如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以唯讀方式開啟資料庫;如果此時資料庫空間出現了空餘,則會成功擷取一個操作資料庫的SQLiteDatabase對象。

我們首先建立一個類(繼承SQLiteOpenHelper)DBOpenHelper.java:

package cn.itcast.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {//建構函式,調用父類的SQLiteOpenHelper的建構函式public DBOpenHelper(Context context) {super(context, "itcast.db", null, 1);//<包>/databases/}@Overridepublic void onCreate(SQLiteDatabase db) {//是在資料庫每一次被建立的時候調用的db.execSQL("CREATE TABLE person(personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//在資料庫的版本發生變化時會被調用db.execSQL("ALTER TABLE person ADD amount integer");}}

onCreate()方法在初次產生資料庫時才會被調用,在onCreate()方法裡可以產生資料庫表結構及添加一些應用使用到的初始化資料。

onUpgrade()方法在資料庫的版本發生變化時會被調用,一般在軟體升級時才需改變版本號碼,而資料庫的版本是由程式員控制的。


然後,我們建立一個測試類別,來實現調用DBOpenHelper中的方法來建立資料庫DBTest.java:

package cn.itcast.test;public class DBTest extends AndroidTestCase {   public void testCreateDB() throws Exception{DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());dbOpenHelper.getWritableDatabase();}}
關於測試需要在AndroidManifest.xml中配置幾條語句,這點不要忘了。

運行測試發現在File Explorer視圖中的/data/data/cn.itcast.db/databases目錄下有個itcast.db的檔案,就是我們建立的資料庫了。

二、完成增刪改查CRUD操作:

我們用Person來做例子

首先,用建立一個javabean:Person.java

package cn.itcast.domain;public class Person {private Integer id;private String name;private String phone;private Integer amount;public Person(){}public Person(String name, String phone, Integer amount) {this.name = name;this.phone = phone;this.amount = amount;}public Person(Integer id, String name, String phone, Integer amount) {this.id = id;this.name = name;this.phone = phone;this.amount = amount;}public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", amount=" + amount + "]";}}
然後,我們需要編寫業務層的類,PersonService.java

package cn.itcast.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import cn.itcast.domain.Person;public class PersonService {private DBOpenHelper dbOpenHelper;public PersonService(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}/** * 添加記錄 * @param person */public void save(Person person){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("insert into person(name, phone, amount) values(?,?,?)",new Object[]{person.getName(), person.getPhone(), person.getAmount()});}/** * 刪除記錄 * @param id 記錄ID */public void delete(Integer id){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("delete from person where personid=?", new Object[]{id});}/** * 更新記錄 * @param person */public void update(Person person){SQLiteDatabase db = dbOpenHelper.getWritableDatabase();db.execSQL("update person set name=?,phone=?,amount=? where personid=?",new Object[]{person.getName(), person.getPhone(),  person.getAmount(), person.getId()});}/** * 查詢記錄 * @param id 記錄ID * @return */public Person find(Integer id){SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]{id.toString()});if(cursor.moveToFirst()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));String name = cursor.getString(cursor.getColumnIndex("name"));String phone = cursor.getString(cursor.getColumnIndex("phone"));return new Person(personid, name, phone, amount);}cursor.close();return null;}/** * 分頁擷取記錄 * @param offset 跳過前面多少條記錄 * @param maxResult 每頁擷取多少條記錄 * @return */public List getScrollData(int offset, int maxResult){List persons = new ArrayList();SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person order by personid asc limit ?,?",new String[]{String.valueOf(offset), String.valueOf(maxResult)});while(cursor.moveToNext()){int personid = cursor.getInt(cursor.getColumnIndex("personid"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));String name = cursor.getString(cursor.getColumnIndex("name"));String phone = cursor.getString(cursor.getColumnIndex("phone"));persons.add(new Person(personid, name, phone, amount));}cursor.close();return persons;}/** * 分頁擷取記錄 * @param offset 跳過前面多少條記錄 * @param maxResult 每頁擷取多少條記錄 * @return */public Cursor getCursorScrollData(int offset, int maxResult){SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select personid as _id,name,phone,amount from person order by personid asc limit ?,?",new String[]{String.valueOf(offset), String.valueOf(maxResult)});return cursor;}/** * 擷取記錄總數 * @return */public long getCount(){SQLiteDatabase db = dbOpenHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select count(*) from person", null);cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}}
然後,我們就需要執行測試了PersonServiceTest.java:

package cn.itcast.test;import java.util.List;import cn.itcast.domain.Person;import cn.itcast.service.DBOpenHelper;import cn.itcast.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase {private static final String TAG = "PersonServiceTest";public void testCreateDB() throws Exception{DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());dbOpenHelper.getWritableDatabase();}public void testSave() throws Exception{PersonService service = new PersonService(this.getContext());for(int i = 0 ; i < 20 ; i++){Person person = new Person("zhangxx"+ i, "136765765"+ i, 100);service.save(person);}}public void testDelete() throws Exception{PersonService service = new PersonService(this.getContext());service.delete(21);}public void testUpdate() throws Exception{PersonService service = new PersonService(this.getContext());Person person = service.find(1);person.setName("zhangxiaoxiao");service.update(person);}public void testFind() throws Exception{PersonService service = new PersonService(this.getContext());Person person = service.find(1);Log.i(TAG, person.toString());}public void testScrollData() throws Exception{PersonService service = new PersonService(this.getContext());List persons = service.getScrollData(0, 5);for(Person person : persons){Log.i(TAG, person.toString());}}public void testCount() throws Exception{PersonService service = new PersonService(this.getContext());long result = service.getCount();Log.i(TAG, result+"");}public void testUpdateAmount() throws Exception{PersonService service = new PersonService(this.getContext());Person person1 = service.find(1);Person person2 = service.find(2);person1.setAmount(100);person2.setAmount(50);service.update(person1);service.update(person2);}}
可以在找到itcast.db之後,通過下載:SQLite Explorer來開啟查看








聯繫我們

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