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