国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程之SQLite數據庫操作方法詳解

2019-10-22 18:31:09
字體:
來源:轉載
供稿:網友

本文實例講述了Android SQLite數據庫操作方法。分享給大家供大家參考,具體如下:

SQLite and Android

SQLite簡介

SQLite是一個非常流行的嵌入式數據庫,它支持SQL語言,并且只利用很少的內存就有很好的性能。此外,它還是開源的,任何人都可以使用它。

SQLite由以下幾個組件組成:SQL編譯器、內核、后端以及附件。SQLite通過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展SQLite的內核變得更加方便。

SQLite支持的數據類型包括:

1. TEXT (類似于Java的String)
2. INTEGER (類似于Java的long)
3. REAL (類似于Java的Double)

更多SQLite數據類型知識可以參考前面相關文章入:詳解SQLite中的數據類型

SQLite In Android

Android在運行時集成了SQLite,因此在Android中使用SQLite數據庫并不需要安裝過程和獲取數據庫使用權限,你只需要定義創建和更新數據庫的語句即可,其他的會由Android平臺替你搞定。

操作SQLite數據庫通常意味著操作文件系統,這種操作還是比較耗時的,因此建議將數據庫操作異步執行。

你的應用創建一個SQLite數據庫,數據在默認情況下,存儲在/DATA/data/APP_NAME/databases/FILENAME。這里DATA是Environment.getDataDirectory()方法返回的值,APP_NAME是你的應用包名

Android開發中使用SQLite數據庫

Activity可以使用Content Provider或者 Service訪問一個數據庫。

創建數據庫

Android不自動提供數據庫。在Android應用程序中使用SQLite,必須自己創建數據庫,然后創建表、索引、填充數據。Android提供了一個SQLiteOpenHelper幫助你創建一個數據庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建數據庫。

SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新數據庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:

構造函數,調用父類SQLiteOpenHelper的構造函數。這個方法需要四個參數:上下文環境,數據庫名字,一個可選的游標工廠(通常是NULL),一個代表你正在使用的數據庫模型版本的整數。
onCreate()方法,它需要一個SQLiteDatabase對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrade()方法,它需要三個參數,一個SQLiteDatabase對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個數據庫從舊的模型轉變為新的模型。

首先,定義需要創建的表結構,使用類來進行抽象,這里示例定義一個新浪微薄的帳號類:

public class AccountTable { public static final String TABLE_NAME = "account_table"; public static final String UID = "uid"; public static final String USERNAME = "username"; public static final String USERNICK = "usernick"; public static final String AVATAR_URL = "avatar_url"; public static final String PORTRAIT = "portrait"; public static final String OAUTH_TOKEN = "oauth_token"; public static final String OAUTH_TOKEN_SECRET = "oauth_token_secret"; public static final String INFOJSON = "json";}

下面代碼展示了如何繼承SQLiteOpenHelper創建數據庫,推薦使用單例類:

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import org.qii.weiciyuan.support.database.table.*;class DatabaseHelper extends SQLiteOpenHelper { private static DatabaseHelper singleton = null; private static final String DATABASE_NAME = "weibo.db"; private static final int DATABASE_VERSION = 16; static final String CREATE_ACCOUNT_TABLE_SQL = "create table " + AccountTable.TABLE_NAME   + "("   + AccountTable.UID + " integer primary key autoincrement,"   + AccountTable.OAUTH_TOKEN + " text,"   + AccountTable.OAUTH_TOKEN_SECRET + " text,"   + AccountTable.PORTRAIT + " text,"   + AccountTable.USERNAME + " text,"   + AccountTable.USERNICK + " text,"   + AccountTable.AVATAR_URL + " text,"   + AccountTable.INFOJSON + " text"   + ");"; DatabaseHelper(Context context) {  super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) {  db.execSQL(CREATE_ACCOUNT_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  switch (oldVersion) {   default:    deleteAllTable(db);    onCreate(db);  } } public static synchronized DatabaseHelper getInstance() {  if (singleton == null) {   singleton = new DatabaseHelper(GlobalContext.getInstance());  }  return singleton; } private void deleteAllTable(SQLiteDatabase db) {  db.execSQL("DROP TABLE IF EXISTS " + AccountTable.TABLE_NAME); }}

增刪改查數據庫

因為SQLite支持標準的SQL語句,因此我們可以用標準SQL語句才增刪改查數據庫,推薦使用占位符的sql語句,看起來更加清爽,下面是我的代碼示例:

package com.hw.droid.hwcatalog;public class DatabaseManager { private static DatabaseManager singleton = null; private SQLiteDatabase wsd = null; private SQLiteDatabase rsd = null; private DatabaseManager() { } public static DatabaseManager getInstance(Context context) {  if (singleton == null) {   synchronized (DatabaseManager.class) {    if (singleton == null) {     DatabaseHelper databaseHelper = DatabaseHelper.getInstance(context);     singleton = new DatabaseManager();     singleton.wsd = databaseHelper.getWritableDatabase();     singleton.rsd = databaseHelper.getReadableDatabase();    }   }  }  return singleton; } public void initAccountTable(List<AccountData> listDatas) {  if (listDatas == null || listDatas.size() <= 0) {   return;  }  wsd.beginTransaction();  try {   for (AccountData data : listDatas) {    insertAccountTable(data);   }   wsd.setTransactionSuccessful();  } finally {   wsd.endTransaction();  } } private void insertAccountTable(AccountData accData) {  String sql = "insert into " + AccountTable.TABLE_NAME + "(" + AccountTable.USERNAME + ", "    + AccountTable.USERNICK + ", " + AccountTable.AVATAR_URL + ", " + AccountTable.PORTRAIT + ", "    + AccountTable.OAUTH_TOKEN + ", " + AccountTable.OAUTH_TOKEN_SECRET + ", " + AccountTable.INFOJSON    + " " + ")" + " values(?, ?, ?, ?, ?, ?, ?)";  wsd.execSQL(sql,    new Object[] { accData.getUserName(), accData.getUserNick(), accData.getUrl(), accData.getPort(),      accData.getToken(), accData.getSecret(), accData.getJson(), accData.getThreads(), }); } public List<AccountData> getAccountDatas() {  List<AccountData> listDatas = selectAccountData();  return listDatas; } private List<AccountData> selectAccountData() {  List<AccountData> listAccountData = new ArrayList<AccountData>();  String querySql = "select " + AccountTable.USERNAME + ", " + AccountTable.USERNICK + ", " + AccountTable.AVATAR_URL + ", " + AccountTable.PORTRAIT + ", " + AccountTable.OAUTH_TOKEN + ", " + AccountTable.OAUTH_TOKEN_SECRET + ", " + AccountTable.INFOJSON " " + " from " + BbsForumsTable.TABLE_NAME;  Cursor cursor = rsd.rawQuery(querySql, null);  if (cursor.moveToFirst()) {   do {    AccountData data = new AccountData();    data.setUserName(cursor.getString(cursor.getColumnIndex(AccountTable.USERNAME)));    data.setUserNick(cursor.getString(cursor.getColumnIndex(AccountTable.USERNICK)));    data.setUrl(cursor.getString(cursor.getColumnIndex(AccountTable.AVATAR_URL)));    data.setPort(cursor.getString(cursor.getColumnIndex(AccountTable.PORTRAIT)));    data.setToken(cursor.getString(cursor.getColumnIndex(AccountTable.OAUTH_TOKEN)));    data.setSecret(cursor.getString(cursor.getColumnIndex(AccountTable.OAUTH_TOKEN_SECRET)));    data.setJson(cursor.getString(cursor.getColumnIndex(AccountTable.INFOJSON)));    listAccountData.add(data);   } while (cursor.moveToNext());  }  cursor.close();  return listAccountData; } public void deleteBbsDatas() {  String delSql = "delete from " + AccountTable.TABLE_NAME;  wsd.execSQL(delSql); }}

事物(DBTransaction)

Android中經常會用到數據庫緩存,特別是wifi情況下遇到數據不一致情況需要更新緩存數據,這個時候就需要用到事物處理,保證操作的完整性和速度。Android中使用SQLite保證事務完整性示例如下:

public void initAccountTable(List<AccountData> listDatas) { if (listDatas == null || listDatas.size() <= 0) {  return; } wsd.beginTransaction(); try {  for (AccountData data : listDatas) {   insertAccountTable(data);  }  wsd.setTransactionSuccessful(); } finally {  wsd.endTransaction(); }}

通過beginTransaction()開啟事務,endTransaction()結束事務,并且設置事務執行成功標識setTransactionSuccessful().

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南木林县| 滨海县| 景宁| 华阴市| 金沙县| 建平县| 扬中市| 新疆| 资阳市| 唐河县| 宜春市| 湖南省| 邛崃市| 柏乡县| 洛南县| 慈溪市| 乃东县| 宁海县| 准格尔旗| 泗阳县| 淳化县| 禹州市| 灵丘县| 平邑县| 红桥区| 利津县| 南川市| 阿克陶县| 蓬莱市| 将乐县| 公安县| 浪卡子县| 德钦县| 裕民县| 咸宁市| 武城县| 道孚县| 山东| 康平县| 土默特右旗| 琼结县|