亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android編程操作嵌入式關系型SQLite數據庫實例詳解

2020-04-11 11:04:09
字體:
來源:轉載
供稿:網友

本文實例分析了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性色xo影院| 国产成人精品久久二区二区91| 精品无人区太爽高潮在线播放| 国产精品av在线| 欧美电影电视剧在线观看| 国产精品一区二区三区久久| 久久91亚洲精品中文字幕奶水| 国产成人精品优优av| 欧美精品在线视频观看| 精品国偷自产在线视频| 秋霞成人午夜鲁丝一区二区三区| 亚洲欧美日韩国产精品| 久久精品国产久精国产思思| 国产精品视频在线播放| 日本一欧美一欧美一亚洲视频| 精品日本美女福利在线观看| 亚洲桃花岛网站| 亚洲三级av在线| 成人国产精品日本在线| 91精品国产高清久久久久久91| 欧美激情第1页| 欧美精品www| 国产精品视频在线观看| 精品久久久久久国产| 午夜精品一区二区三区视频免费看| 一区二区三区视频免费| 亚洲精品wwwww| 一区二区亚洲精品国产| 久久国产精品影视| 欧美一性一乱一交一视频| 亚洲欧美成人网| 欧美激情亚洲另类| 久久久久久欧美| 国产精品视频精品视频| 日韩视频第一页| 亚洲第一天堂无码专区| 日韩在线视频网| 久久亚洲综合国产精品99麻豆精品福利| 在线免费观看羞羞视频一区二区| 免费不卡欧美自拍视频| 日韩在线视频免费观看| 亚洲第一区中文99精品| 日韩高清人体午夜| 97香蕉久久超级碰碰高清版| 一区二区日韩精品| 中文字幕一区二区三区电影| 成人日韩在线电影| 国产xxx69麻豆国语对白| 国产精品海角社区在线观看| 久久久久久国产三级电影| 日韩免费黄色av| 亚洲激情久久久| 国产激情视频一区| 久久精品男人天堂| 精品国产鲁一鲁一区二区张丽| 色综合老司机第九色激情| 91沈先生在线观看| 欧美视频第一页| 久久久精品国产一区二区| 亚洲免费伊人电影在线观看av| 5278欧美一区二区三区| 欧美在线性爱视频| 精品夜色国产国偷在线| 亚洲欧美日韩天堂| 日韩国产欧美精品在线| 国内精品视频久久| 色先锋久久影院av| 欧美超级乱淫片喷水| 97福利一区二区| 精品国产鲁一鲁一区二区张丽| 国产这里只有精品| 中文字幕亚洲图片| 欧美一级电影在线| 国语自产偷拍精品视频偷| 国产成人一区二区三区小说| 91视频国产一区| 欧美国产亚洲精品久久久8v| 欧美一区二区大胆人体摄影专业网站| 一本大道久久加勒比香蕉| 久久久久久高潮国产精品视| 国产深夜精品福利| 欧美最近摘花xxxx摘花| 国产精品久久久| 亚洲大胆美女视频| 韩剧1988免费观看全集| 国产婷婷色综合av蜜臀av| 亚洲国产精品yw在线观看| 欧美最近摘花xxxx摘花| 国精产品一区一区三区有限在线| 国产精品r级在线| 中文字幕亚洲综合久久筱田步美| 国产日韩欧美视频| 色老头一区二区三区| 欧美三级xxx| 日韩欧美黄色动漫| 欧美日韩国产影院| 久久国内精品一国内精品| 精品福利免费观看| 亚洲理论在线a中文字幕| 欧美精品18videos性欧| 国产不卡精品视男人的天堂| 亚洲嫩模很污视频| 亚洲欧美日韩一区二区三区在线| 日韩亚洲欧美中文在线| 国产成人免费91av在线| 在线日韩欧美视频| 久久久久久久久久久网站| 亚洲精品美女久久久| 亚洲美女又黄又爽在线观看| 在线精品视频视频中文字幕| 亚洲黄页视频免费观看| 久久全球大尺度高清视频| 欧美激情一区二区三区久久久| 成人国产精品色哟哟| 日韩中文字幕在线视频播放| 国精产品一区一区三区有限在线| 欧美精品免费播放| 午夜免费久久久久| 亚洲欧洲xxxx| 91免费电影网站| 91精品在线一区| 亚洲免费小视频| 狠狠色噜噜狠狠狠狠97| 欧美激情一级精品国产| 中文字幕九色91在线| 国产精品色午夜在线观看| 国产成人激情小视频| 97人洗澡人人免费公开视频碰碰碰| 最近2019好看的中文字幕免费| 欧美日韩国产中文字幕| 一本大道香蕉久在线播放29| 超薄丝袜一区二区| 久久人91精品久久久久久不卡| 日韩在线免费视频观看| 亚洲国产欧美一区| 亚洲欧美国产一区二区三区| 国产精品成人免费视频| 伊人一区二区三区久久精品| 少妇高潮 亚洲精品| 久久精品成人欧美大片古装| 亚洲免费伊人电影在线观看av| 亚洲精品久久久久中文字幕二区| www欧美xxxx| 亚洲欧美日本精品| 精品中文字幕在线| 欧美综合一区第一页| 久久久国产成人精品| 韩国精品美女www爽爽爽视频| 91久久久在线| 中文字幕亚洲二区| 亚洲视频欧美视频| 亚洲精品国产美女| 国产精品美女视频网站| 亚洲美女精品成人在线视频| 亚洲国产高清自拍| 欧美精品在线免费观看| 97精品伊人久久久大香线蕉| 日本精品视频在线观看| 国产精品video| 欧美激情一区二区三区高清视频| 欧美一级大胆视频| 97在线精品国自产拍中文| 久久99国产精品久久久久久久久| 精品亚洲男同gayvideo网站|