摘要:和用來向表中插入新的行數(shù)據(jù),每個(gè)對(duì)象都將一個(gè)行記錄對(duì)應(yīng)。數(shù)據(jù)庫(kù)查詢結(jié)果作為對(duì)象返回。會(huì)緩存數(shù)據(jù)庫(kù)實(shí)例。如果數(shù)據(jù)庫(kù)不存在,就會(huì)執(zhí)行方法,如果數(shù)據(jù)庫(kù)版本發(fā)生變化則會(huì)執(zhí)行方法。文件通常是不存在數(shù)據(jù)庫(kù)中的,應(yīng)該存放文件的路徑地址。
ContentValue 和 CursorSQLite 數(shù)據(jù)庫(kù)文件存儲(chǔ)在設(shè)備上的 /data/data/package_name/databases 文件夾中,所有的數(shù)據(jù)庫(kù)都市私有的,只能被創(chuàng)建者訪問。
使用數(shù)據(jù)庫(kù)時(shí)最好的做法是將底層數(shù)據(jù)庫(kù)封裝起來,只公開與該數(shù)據(jù)庫(kù)進(jìn)行交互時(shí)必須使用的公有方法和常量,這一般會(huì)用到所謂的輔助類。
Content Value 用來向表中插入新的行數(shù)據(jù),每個(gè) ContentValues 對(duì)象都將一個(gè)行記錄對(duì)應(yīng)。
數(shù)據(jù)庫(kù)查詢結(jié)果作為 Cursor 對(duì)象返回。Cursor 是底層數(shù)據(jù)中的結(jié)果集的指針,它沒有提取和返回結(jié)果值的副本。
Cursor 常用的幾個(gè)方法:
moveToFirst
moveToNext
moveToPrevious
moveToPosition
getCount
getColumnIndexOrThrow
getColumnName
getColumnNames
getPosition
Android 提供了一種方便的機(jī)制,可以確保異步執(zhí)行查詢,API Level 11 引入了 CursorLoader 類和相關(guān)的 Loader Manager,現(xiàn)在他們已經(jīng)成為了支持庫(kù)的一部分,從而允許你在支持早期的 Android 版本的同時(shí)使用這些功能。
是一個(gè)抽象類,用來實(shí)現(xiàn)創(chuàng)建、打開和升級(jí)數(shù)據(jù)庫(kù)。會(huì)緩存數(shù)據(jù)庫(kù)實(shí)例。通過 onCreate 和 onUpgrade 方法來分別處理創(chuàng)建新數(shù)據(jù)庫(kù)和升級(jí)新版本數(shù)據(jù)庫(kù)。
等到需要數(shù)據(jù)庫(kù)時(shí)在創(chuàng)建和打開這些數(shù)據(jù)庫(kù)是一種很好的做法,SQLiteOpenHelper 會(huì)再打開數(shù)據(jù)庫(kù)后緩存他的實(shí)例,一般情況下無(wú)需手動(dòng)關(guān)閉數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)操作(特別是打開或創(chuàng)建數(shù)據(jù)庫(kù))需要很長(zhǎng)時(shí)間才能完成,為了確保不影響用戶操作體驗(yàn),應(yīng)該使所有數(shù)據(jù)庫(kù)事物異步執(zhí)行。
通常可以使用 SQLiteOpenHelper 的 getWritableDatabase 或者 getReadableDatabase 來分別打開一個(gè)可寫或只讀的實(shí)例。如果數(shù)據(jù)庫(kù)不存在,就會(huì)執(zhí)行 onCreate 方法,如果數(shù)據(jù)庫(kù)版本發(fā)生變化則會(huì)執(zhí)行 onUpgrade 方法。
也可以不使用 SQLiteOpenHelper 打開數(shù)據(jù)庫(kù)實(shí)例,可以通過 Context 對(duì)象的 openOrCreateDatabase 方法
public class HoardDBOPenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myDatabase.db"; private static final String DATABASE_TABLE = "GoldHoards"; private static final int DATABASE_VERSION = 1; public static final String KEY_ID = "_id"; public static final String KEY_GOLD_HOARD_NAME_COLUMN = "GOLD_HOARD_NAME_COLUMN"; public static final String KEY_GOLD_HOARD_ACCESSIBLE_COLUMN = "OLD_HOARD_ACCESSIBLE_COLUMN"; public static final String KEY_GOLD_HOARDED_COLUMN = "GOLD_HOARDED_COLUMN"; private static final String DATABASE_CREATE = "create table " + DATABASE_NAME + "(" + KEY_ID + "integer primary key autoincrement, " + KEY_GOLD_HOARD_NAME_COLUMN + " text not null, " + KEY_GOLD_HOARDED_COLUMN + " float, " + KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + " integer);"; public HoardDBOPenHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_CREATE); onCreate(db); } }
數(shù)據(jù)庫(kù)設(shè)計(jì)注意事項(xiàng)
每個(gè)表都增加一個(gè) _id 作為每一行的索引字段。如果使用 Content Provider 就必須要有一個(gè) 唯一的 ID 字段。
文件通常是不存在數(shù)據(jù)庫(kù)中的,應(yīng)該存放文件的路徑地址。
數(shù)據(jù)庫(kù)操作實(shí)例,提供了操作數(shù)據(jù)庫(kù)的一切動(dòng)作,包含增刪改查、執(zhí)行 SQL 語(yǔ)句。
每個(gè)數(shù)據(jù)庫(kù)查詢都會(huì)作為一個(gè) Cursor 返回,這就使得 Android 可以按需檢索和釋放行和列的值,從而更加高效的管理資源。
要對(duì)一個(gè)數(shù)據(jù)庫(kù)對(duì)象進(jìn)行查詢,需要使用 query 方法,并傳入以下的一些參數(shù):
一個(gè)可選的布爾值,用來指定結(jié)果集是否只包含唯一的值。
要查詢的表的名稱。
一個(gè)字符串?dāng)?shù)組形式的投影,列出了包含在結(jié)果集中的列。
一條 where 子句,定義了要返回的行??梢栽谄渲邪??” 通配符,它將會(huì)被通過選擇參數(shù)傳入的值替換。
一個(gè)選擇參數(shù)字符串的數(shù)組,它將會(huì)替換 where 子句中的“?”,通配符。
一條 group by 子句,用來定義返回的行的分組方式。
一條 having 子句,如果指定了一條 group by 子句,則蓋子句會(huì)定義要包含那些行組。
一個(gè)字符串,用來描述返回的行的順序。
一個(gè)字符串,用來定義結(jié)果集中的最大行數(shù)。
public void queryHoard() { String[] result_cloums = new String[] { KEY_ID, KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, KEY_GOLD_HOARDED_COLUMN }; // 指定用于限制結(jié)果的 where 子句 String where = KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + "=" + 1; // 根據(jù)需要把以下語(yǔ)句替換為有效的SQL語(yǔ)句 String[] whereArgs = null; String groupBy = null; String having = null; String order = null; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query(DATABASE_NAME, result_cloums, where, whereArgs, groupBy, having, order); }
要 從 Cursor 中提取值,首先要使用前面描述過的 moveTo 系列的方法將游標(biāo)放到結(jié)果 Cursor 的正確行中,然后使用類型安全的 get
當(dāng)你認(rèn)為列在所有情況下都存在時(shí),使用 getColumnIndexOrThrow 是一種不錯(cuò)的辦法,當(dāng)列有可能不存在游標(biāo)中時(shí),使用 getColumnIndex 可以檢查結(jié)果是否為 -1 比捕獲異常更加高效。
int columnIndex = cursor.getColumnIndex(KEY_GOLD_HOARDED_COLUMN); if (columnIndex > -1) { String columnValue = cursor.getColumnName(columnIndex); // 存在時(shí) } else { // 不存在 }
從 Cursor 中獲取值:
float totalHoard = 0f; float averageHoard = 0f; // 找出所用列的索引 int GOLD_HOARDED_COLUMN_INDEX = cursor.getColumnIndexOrThrow(KEY_GOLD_HOARD_NAME_COLUMN); // 遍歷游標(biāo) while (cursor.moveToNext()) { float hoard = cursor.getFloat(GOLD_HOARDED_COLUMN_INDEX); totalHoard += hoard; } // 計(jì)算平均值 float cursorCount = cursor.getCount(); averageHoard = cursorCount > 0 ? (totalHoard / cursorCount) : Float.NaN; // 完成之后關(guān)閉游標(biāo) cursor.close();
SQLiteDatabase 提供了 insert、delete、update 方法來封裝執(zhí)行這些操作需要的 SQL 語(yǔ)句。如果你希望手動(dòng)去執(zhí)行這些操作,需要用到 execSQL 方法可以對(duì)數(shù)據(jù)庫(kù)表執(zhí)行有效的 SQL 語(yǔ)句。
1. 插入行
// 創(chuàng)建一個(gè)要插入的行新值 ContentValues contentValues = new ContentValues(); // 為每行賦值 contentValues.put(KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, ""); contentValues.put(KEY_GOLD_HOARD_NAME_COLUMN, 123); contentValues.put(KEY_GOLD_HOARDED_COLUMN, true); // 把行插入到表中 SQLiteDatabase sdb = this.getReadableDatabase(); sdb.insert(this.DATABASE_TABLE, null, contentValues);
insert 方法的第二個(gè)參數(shù)稱為 null 列侵入(null column hack),如果想添加一個(gè)空行,在傳入 ContentValues 還必須傳入一個(gè)顯示的 null。
2. 更新行
// 創(chuàng)建更新行的 ContentValues ContentValues updatedValues = new ContentValues(); // 為每一行賦值 updatedValues.put(KEY_GOLD_HOARDED_COLUMN, false); // 指定一個(gè) where 子語(yǔ)句定義那些行應(yīng)該被更新 String where = KEY_ID + "=" + 1; String[] whereArgs = null; // 使用新值更新數(shù)據(jù)庫(kù)記錄 SQLiteDatabase sdb = getReadableDatabase(); sdb.update(DATABASE_TABLE, updatedValues, where, whereArgs);
3. 刪除行
// 指定一個(gè) where 子語(yǔ)句定義那些行應(yīng)該被刪除 String where = KEY_ID + "=" + 1; String[] whereArgs = null; // 使用新值更新數(shù)據(jù)庫(kù)記錄 SQLiteDatabase sdb = getReadableDatabase(); sdb.delete(DATABASE_TABLE, where, whereArgs);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/17452.html
摘要:目前支持兩種關(guān)系型數(shù)據(jù)庫(kù)需要鏈接對(duì)應(yīng)的和,并對(duì)其接口進(jìn)行了封裝,使用更加的方便簡(jiǎn)潔并且只需要換個(gè),就可以隨時(shí)切換成其他數(shù)據(jù)庫(kù)引擎,而不需要修改接口。 TBOX目前支持sqlite3、mysql兩種關(guān)系型數(shù)據(jù)庫(kù)(需要鏈接對(duì)應(yīng)的libsqlite3.a和libmysql.a),并對(duì)其接口進(jìn)行了封裝,使用更加的方便簡(jiǎn)潔并且只需要換個(gè)url,就可以隨時(shí)切換成其他數(shù)據(jù)庫(kù)引擎,而不需要修改接口。 ...
摘要:文檔開發(fā)基于單元測(cè)試實(shí)現(xiàn)的自動(dòng)化文檔當(dāng)前文檔開發(fā)計(jì)劃功能開發(fā)當(dāng)前計(jì)劃功能技術(shù)債務(wù)清償當(dāng)前技術(shù)債務(wù)單元測(cè)試盡可能減少當(dāng)前單元測(cè)試成為開發(fā)者需要加入我們的組織,如有相關(guān)意愿請(qǐng)發(fā)送郵件至小牛哥,我們會(huì)聯(lián)系你的。 QueryPHP 非常歡迎各位給我們共同的偉大的作品添磚加瓦,實(shí)現(xiàn)為 PHP 社區(qū)提供一個(gè)好框架的美好愿景。 文檔開發(fā).基于單元測(cè)試實(shí)現(xiàn)的自動(dòng)化文檔 當(dāng)前文檔開發(fā) 計(jì)劃功能.開發(fā)...
閱讀 1839·2021-09-22 15:55
閱讀 3527·2021-09-07 10:26
閱讀 634·2019-08-30 15:54
閱讀 690·2019-08-29 16:34
閱讀 844·2019-08-26 14:04
閱讀 3265·2019-08-26 11:47
閱讀 2139·2019-08-26 11:33
閱讀 2300·2019-08-23 15:17