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