成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Database (數(shù)據(jù)庫)

whjin / 383人閱讀

摘要:和用來向表中插入新的行數(shù)據(jù),每個對象都將一個行記錄對應(yīng)。數(shù)據(jù)庫查詢結(jié)果作為對象返回。會緩存數(shù)據(jù)庫實例。如果數(shù)據(jù)庫不存在,就會執(zhí)行方法,如果數(shù)據(jù)庫版本發(fā)生變化則會執(zhí)行方法。文件通常是不存在數(shù)據(jù)庫中的,應(yīng)該存放文件的路徑地址。

  

SQLite 數(shù)據(jù)庫文件存儲在設(shè)備上的 /data/data/package_name/databases 文件夾中,所有的數(shù)據(jù)庫都市私有的,只能被創(chuàng)建者訪問。
使用數(shù)據(jù)庫時最好的做法是將底層數(shù)據(jù)庫封裝起來,只公開與該數(shù)據(jù)庫進(jìn)行交互時必須使用的公有方法和常量,這一般會用到所謂的輔助類。

ContentValue 和 Cursor

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 版本的同時使用這些功能。


SQLiteOpenHelper

是一個抽象類,用來實現(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)該存放文件的路徑地址。


SQLiteDatabase

數(shù)據(jù)庫操作實例,提供了操作數(shù)據(jù)庫的一切動作,包含增刪改查、執(zhí)行 SQL 語句。


數(shù)據(jù)庫查詢

每個數(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 中提取值

要 從 Cursor 中提取值,首先要使用前面描述過的 moveTo 系列的方法將游標(biāo)放到結(jié)果 Cursor 的正確行中,然后使用類型安全的 get 方法來返回存儲在指定列的當(dāng)前行中的值。為了找到特定列在游標(biāo)中的索引,需要使用 getColumnIndex 和 getColumnIndexOrThrow 方法。
當(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)文章

  • [轉(zhuǎn)]:tbox中數(shù)據(jù)庫的使用

    摘要:目前支持兩種關(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ù)庫引擎,而不需要修改接口。 ...

    _ang 評論0 收藏0
  • 何成為 QueryPHP 開發(fā)者

    摘要:文檔開發(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ā)...

    bigdevil_s 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<