Android編程操作嵌入式關係型SQLite資料庫執行個體詳解_Android

來源:互聯網
上載者:User

本文執行個體分析了Android編程操作嵌入式關係型SQLite資料庫的方法。分享給大家供大家參考,具體如下:

SQLite特點

1.Android平台中嵌入了一個關係型資料庫SQLite,和其他資料庫不同的是SQLite儲存資料時不區分類型

例如一個欄位聲明為Integer類型,我們也可以將一個字串存入,一個欄位聲明為布爾型,我們也可以存入浮點數。

除非是主鍵被定義為Integer,這時只能儲存64位整數

2.建立資料庫的表時可以不指定資料類型,例如:

複製代碼 代碼如下:
CREATE TABLEperson(id INTEGER PRIMARY KEY, name)

3.SQLite支援大部分標準SQL語句,增刪改查語句都是通用的,分頁查詢語句和MySQL相同
SELECT * FROMperson LIMIT 20 OFFSET 10SELECT * FROMperson LIMIT 20,10

建立資料庫

1.定義類繼承SQLiteOpenHelper
2.聲明建構函式,4個參數
3.重寫onCreate()方法
4. 重寫upGrade()方法

樣本:

package cn.itcast.sqlite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteDatabase.CursorFactory;public class DBOpenHelper extends SQLiteOpenHelper {  /**   * 建立OpenHelper   * @param context 上下文   * @param name 資料庫名   * @param factory 遊標工廠   * @param version 資料庫版本, 不要設定為0, 如果為0則會每次都建立資料庫   */  public DBOpenHelper(Context context, String name, CursorFactory factory, int version) {    super(context, name, factory, version);  }  /**   * 當資料庫第一次建立的時候被調用   */  public void onCreate(SQLiteDatabase db) {    db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name)");  }  /**   * 當資料庫版本發生改變的時候被調用   */  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    db.execSQL("ALTER TABLE person ADD balance");  }}public void testCreateDB() {  DBOpenHelper helper = new DBOpenHelper(getContext(), "itcast.db", null, 2);  helper.getWritableDatabase(); // 建立資料庫}

CRUD操作

1.和JDBC訪問資料庫不同,操作SQLite資料庫無需載入驅動,不用擷取串連,直接可以使用

擷取SQLiteDatabase對象之後通過該對象直接可以執行SQL語句:

SQLiteDatabase.execSQL()SQLiteDatabase.rawQuery()

2.getReadableDatabase()和getWritableDatabase()的區別

查看原始碼後我們發現getReadableDatabase()在通常情況下返回的就是getWritableDatabase()拿到的資料庫只有在拋出異常的時候才會以唯讀方式開啟

3.資料庫物件緩衝

getWritableDatabase()方法最後會使用一個成員變數記住這個資料庫物件,下次開啟時判斷是否重用

4.SQLiteDatabase封裝了insert()、delete()、update()、query()四個方法也可以對資料庫進行操作

這些方法封裝了部分SQL語句,通過參數進行拼接

執行crud操作有兩種方式,第一種方式自己寫sql語句執行操作,第二種方式是使用SQLiteDatabase類調用響應的方法執行操作

execSQL()方法可以執行insert、delete、update和CREATETABLE之類有更改行為的SQL語句; rawQuery()方法用於執行select語句。

第一種方式樣本:

package cn.itcast.sqlite.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.sqlite.DBOpenHelper;import cn.itcast.sqlite.domain.Person;public class SQLPersonService {  private DBOpenHelper helper;  public SQLPersonService(Context context) {    helper = new DBOpenHelper(context, "itcast.db", null, 2);//初始化資料庫  }  /**   * 插入一個Person   * @param p 要插入的Person   */  public void insert(Person p) {    SQLiteDatabase db = helper.getWritableDatabase(); //擷取到資料庫    db.execSQL("INSERT INTO person(name,phone,balance) VALUES(?,?)", new Object[] { p.getName(), p.getPhone() });    db.close();  }  /**   * 根據ID刪除   * @param id 要刪除的PERSON的ID   */  public void delete(Integer id) {    SQLiteDatabase db = helper.getWritableDatabase();    db.execSQL("DELETE FROM person WHERE id=?", new Object[] { id });    db.close();  }  /**   * 更新Person   * @param p 要更新的Person   */  public void update(Person p) {    SQLiteDatabase db = helper.getWritableDatabase();    db.execSQL("UPDATE person SET name=?,phone=?,balance=? WHERE id=?", new Object[] { p.getName(), p.getPhone(), p.getBalance(), p.getId() });    db.close();  }  /**   * 根據ID尋找   * @param id 要查的ID   * @return 對應的對象, 如果未找到返回null   */  public Person find(Integer id) {    SQLiteDatabase db = helper.getReadableDatabase();    Cursor cursor = db.rawQuery("SELECT name,phone,balance FROM person WHERE id=?", new String[] { id.toString() });    Person p = null;    if (cursor.moveToNext()) {      String name = cursor.getString(cursor.getColumnIndex("name"));      String phone = cursor.getString(1);      Integer balance = cursor.getInt(2);      p = new Person(id, name, phone, balance);    }    cursor.close();    db.close();    return p;  }  /**   * 查詢所有Person對象   * @return Person對象集合, 如未找到, 返回一個size()為0的List   */  public List<Person> findAll() {    SQLiteDatabase db = helper.getReadableDatabase();    Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person", null);    List<Person> persons = new ArrayList<Person>();    while (cursor.moveToNext()) {      Integer id = cursor.getInt(0);      String name = cursor.getString(1);      String phone = cursor.getString(2);      Integer balance = cursor.getInt(3);      persons.add(new Person(id, name, phone, balance));    }    cursor.close();    db.close();    return persons;  }  /**   * 查詢某一頁資料   * @param page 頁碼   * @param size 每頁記錄數   * @return   */  public List<Person> findPage(int page, int size) {    SQLiteDatabase db = helper.getReadableDatabase();    Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person LIMIT ?,?" //        , new String[] { String.valueOf((page - 1) * size), String.valueOf(size) });    List<Person> persons = new ArrayList<Person>();    while (cursor.moveToNext()) {      Integer id = cursor.getInt(0);      String name = cursor.getString(1);      String phone = cursor.getString(2);      Integer balance = cursor.getInt(3);      persons.add(new Person(id, name, phone, balance));    }    cursor.close();    db.close();    return persons;  }  /**   * 擷取記錄數   * @return 記錄數   */  public int getCount() {    SQLiteDatabase db = helper.getReadableDatabase();    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM person", null);    cursor.moveToNext();    return cursor.getInt(0);  }}

第二種方式樣本:

/** * 插入一個Person * @param p 要插入的Person */public void insert(Person p) {  SQLiteDatabase db = helper.getWritableDatabase();  ContentValues values = new ContentValues();  values.put("name", p.getName());  values.put("phone", p.getPhone());  values.put("balance", p.getBalance());  // 第一個參數是表名, 第二個參數是如果要插入一條空記錄時指定的某一列的名字, 第三個參數是資料  db.insert("person", null, values);  db.close();}/** * 根據ID刪除 * @param id 要刪除的PERSON的ID */public void delete(Integer id) {  SQLiteDatabase db = helper.getWritableDatabase();  db.delete("person", "id=?", new String[] { id.toString() });  db.close();}/** * 更新Person * @param p 要更新的Person */public void update(Person p) {  SQLiteDatabase db = helper.getWritableDatabase();  ContentValues values = new ContentValues();  values.put("id", p.getId());  values.put("name", p.getName());  values.put("phone", p.getPhone());  values.put("balance", p.getBalance());  db.update("person", values, "id=?", new String[] { p.getId().toString() });  db.close();}/** * 根據ID尋找 * @param id 要查的ID * @return 對應的對象, 如果未找到返回null */public Person find(Integer id) {  SQLiteDatabase db = helper.getReadableDatabase();  Cursor cursor = db.query("person", new String[] { "name", "phone", "balance" }, "id=?", new String[] { id.toString() }, null, null, null);  Person p = null;  if (cursor.moveToNext()) {    String name = cursor.getString(cursor.getColumnIndex("name"));    String phone = cursor.getString(1);    Integer balance = cursor.getInt(2);    p = new Person(id, name, phone, balance);  }  cursor.close();  db.close();  return p;}/** * 查詢所有Person對象 * @return Person對象集合, 如未找到, 返回一個size()為0的List */public List<Person> findAll() {  SQLiteDatabase db = helper.getReadableDatabase();  Cursor cursor = db.query("person", new String[] { "id", "name", "phone", "balance" }, null, null, null, null, "id desc");  List<Person> persons = new ArrayList<Person>();  while (cursor.moveToNext()) {    Integer id = cursor.getInt(0);    String name = cursor.getString(1);    String phone = cursor.getString(2);    Integer balance = cursor.getInt(3);    persons.add(new Person(id, name, phone, balance));  }  cursor.close();  db.close();  return persons;}/** * 查詢某一頁資料 * @param page 頁碼 * @param size 每頁記錄數 * @return */public List<Person> findPage(int page, int size) {  SQLiteDatabase db = helper.getReadableDatabase();  Cursor cursor = db.query( //      "person", new String[] { "id", "name", "phone", "balance" }, null, null, null, null, null, (page - 1) * size + "," + size);  List<Person> persons = new ArrayList<Person>();  while (cursor.moveToNext()) {    Integer id = cursor.getInt(0);    String name = cursor.getString(1);    String phone = cursor.getString(2);    Integer balance = cursor.getInt(3);    persons.add(new Person(id, name, phone, balance));  }  cursor.close();  db.close();  return persons;}/** * 擷取記錄數 * @return 記錄數 */public int getCount() {  SQLiteDatabase db = helper.getReadableDatabase();  Cursor cursor = db.query( //      "person", new String[] { "COUNT(*)" }, null, null, null, null, null);  cursor.moveToNext();  return cursor.getInt(0);}

交易管理

1.使用在SQLite資料庫時可以使用SQLiteDatabase類中定義的相關方法控制事務

beginTransaction() 開啟事務
setTransactionSuccessful() 設定事務成功標記
endTransaction() 結束事務

2.endTransaction()需要放在finally中執行,否則事務只有到逾時的時候才自動結束,會降低資料庫並發效率

樣本:

public void remit(int from, int to, int amount) {  SQLiteDatabase db = helper.getWritableDatabase();  // 開啟事務  try {    db.beginTransaction();    db.execSQL("UPDATE person SET balance=balance-? WHERE id=?", new Object[] { amount, from });    System.out.println(1 / 0);    db.execSQL("UPDATE person SET balance=balance+? WHERE id=?", new Object[] { amount, to });    // 設定事務標記    db.setTransactionSuccessful();  } finally {    // 結束事務    db.endTransaction();  }  db.close();}

希望本文所述對大家Android程式設計有所協助。

相關文章

聯繫我們

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