W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
關(guān)系型數(shù)據(jù)庫是在 SQLite 基礎(chǔ)上實(shí)現(xiàn)的本地?cái)?shù)據(jù)操作機(jī)制,提供給用戶無需編寫原生 SQL 語句就能進(jìn)行數(shù)據(jù)增刪改查的方法,同時(shí)也支持原生 SQL 操作。
數(shù)據(jù)庫的創(chuàng)建和刪除
關(guān)系型數(shù)據(jù)庫提供了數(shù)據(jù)庫創(chuàng)建方式,以及對應(yīng)的刪除接口,涉及的 API 如下所示。
類名 | 接口名 | 描述 |
---|---|---|
StoreConfig.Builder | public builder() | 對數(shù)據(jù)庫進(jìn)行配置,包括設(shè)置數(shù)據(jù)庫名、存儲(chǔ)模式、日志模式、同步模式,是否為只讀,及對數(shù)據(jù)庫加密。 |
RdbOpenCallback | public abstract void onCreate(RdbStore store) | 數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào),開發(fā)者可以在該方法中初始化表結(jié)構(gòu),并添加一些應(yīng)用使用到的初始化數(shù)據(jù)。 |
RdbOpenCallback | public abstract void onUpgrade(RdbStore store, int currentVersion, int targetVersion) | 數(shù)據(jù)庫升級(jí)時(shí)被回調(diào)。 |
DatabaseHelper | public RdbStore getRdbStore(StoreConfig config, int version, RdbOpenCallback openCallback, ResultSetHook resultSetHook) | 根據(jù)配置創(chuàng)建或打開數(shù)據(jù)庫。 |
DatabaseHelper | public boolean deleteRdbStore(String name) | 刪除指定的數(shù)據(jù)庫。 |
數(shù)據(jù)庫的加密
關(guān)系型數(shù)據(jù)庫提供數(shù)據(jù)庫加密的能力,創(chuàng)建數(shù)據(jù)庫時(shí)傳入指定密鑰、創(chuàng)建加密數(shù)據(jù)庫,后續(xù)打開加密數(shù)據(jù)庫時(shí),需要傳入正確密鑰。
類名 | 接口名 | 描述 |
---|---|---|
StoreConfig.Builder | Builder setEncryptKey(byte[] encryptKey) | 為數(shù)據(jù)庫配置類設(shè)置數(shù)據(jù)庫加密密鑰,創(chuàng)建或打開數(shù)據(jù)庫時(shí)傳入包含數(shù)據(jù)庫加密密鑰的配置類,即可創(chuàng)建或打開加密數(shù)據(jù)庫。 |
數(shù)據(jù)庫的增刪改查
關(guān)系型數(shù)據(jù)庫提供本地?cái)?shù)據(jù)增刪改查操作的能力,相關(guān) API 如下所示。
關(guān)系型數(shù)據(jù)庫提供了插入數(shù)據(jù)的接口,通過 ValuesBucket 輸入要存儲(chǔ)的數(shù)據(jù),通過返回值判斷是否插入成功,插入成功時(shí)返回最新插入數(shù)據(jù)所在的行號(hào),失敗則返回 -1。
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | long insert(String table, ValuesBucket initialValues) | 向數(shù)據(jù)庫插入數(shù)據(jù)。table:待添加數(shù)據(jù)的表名。initialValues:以ValuesBucket存儲(chǔ)的待插入的數(shù)據(jù)。它提供一系列put方法,如putString(String columnName, String values),putDouble(String columnName, double value),用于向ValuesBucket中添加數(shù)據(jù)。 |
調(diào)用更新接口,傳入要更新的數(shù)據(jù),并通過AbsRdbPredicates 指定更新條件。該接口的返回值表示更新操作影響的行數(shù)。如果更新失敗,則返回0。
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | int update(ValuesBucket values, AbsRdbPredicates predicates) | 更新數(shù)據(jù)庫表中符合謂詞指定條件的數(shù)據(jù)。values:以 ValuesBucket 存儲(chǔ)的要更新的數(shù)據(jù)。predicates:指定了更新操作的表名和條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè):RdbPredicates 和 RawRdbPredidates。RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置更新條件。RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持equalTo 等接口調(diào)用。 |
調(diào)用刪除接口,通過 AbsRdbPredicates 指定刪除條件。該接口的返回值表示刪除的數(shù)據(jù)行數(shù),可根據(jù)此值判斷是否刪除成功。如果刪除失敗,則返回 0。
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | int delete(AbsRdbPredicates predicates) | 刪除數(shù)據(jù)。predicates:Rdb 謂詞,指定了刪除操作的表名和條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè):RdbPredicates 和 RawRdbPredidates。RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置更新條件。 RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持 equalTo 等接口調(diào)用。 |
關(guān)系型數(shù)據(jù)庫提供了兩種查詢數(shù)據(jù)的方式:
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | ResultSet query(AbsRdbPredicates predicates, String[] columns) | 查詢數(shù)據(jù)。predicates:謂詞,可以設(shè)置查詢條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè): RdbPredicates 和 RawRdbPredidates。 RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置查詢條件。RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持 equalTo 等接口調(diào)用。columns:規(guī)定查詢返回的列。 |
RdbStore | ResultSet querySql(String sql, String[] sqlArgs) | 執(zhí)行原生的用于查詢操作的 SQL 語句。sql:原生用于查詢的 sql 語句。sqlArgs:sql 語句中占位符參數(shù)的值,若 select 語句中沒有使用占位符,該參數(shù)可以設(shè)置為 null。 |
數(shù)據(jù)庫謂詞的使用
關(guān)系型數(shù)據(jù)庫提供了用于設(shè)置數(shù)據(jù)庫操作條件的謂詞 AbsRdbPredicates,其中包括兩個(gè)實(shí)現(xiàn)子類 RdbPredicates 和 RawRdbPredicates:
類名 | 接口名 | 描述 |
---|---|---|
RdbPredicates | RdbPredicates equalTo(String field, String value) | 設(shè)置謂詞條件,滿足filed字段與value值相等。 |
RdbPredicates | RdbPredicates notEqualTo(String field, String value) | 設(shè)置謂詞條件,滿足filed字段與value值不相等。 |
RdbPredicates | RdbPredicates beginsWith(String field, String value) | 設(shè)置謂詞條件,滿足field字段以value值開頭。 |
RdbPredicates | RdbPredicates between(String field, int low, int high) | 設(shè)置謂詞條件,滿足field字段在最小值low和最大值high之間。 |
RdbPredicates | RdbPredicates orderByAsc(String field) | 設(shè)置謂詞條件,根據(jù)field字段升序排列。 |
RawRdbPredicates | void setWhereClause(String whereClause) | 設(shè)置where條件子句。 |
RawRdbPredicates | void setWhereArgs(List<String> whereArgs) | 設(shè)置whereArgs參數(shù),該值表示where子句中占位符的值。 |
查詢結(jié)果集的使用
關(guān)系型數(shù)據(jù)庫提供了查詢返回的結(jié)果集 ResultSet,他指向查詢結(jié)果中的一行數(shù)據(jù),供用戶對查詢結(jié)果進(jìn)行遍歷和訪問。ReusltSet 的對外 API 如下表格。
類名 | 接口名 | 描述 |
---|---|---|
ResultSet | boolean goTo(int offset) | 從結(jié)果集當(dāng)前位置移動(dòng)指定偏移量。 |
ResultSet | boolean goToRow(int position) | 將結(jié)果集移動(dòng)到指定位置。 |
ResultSet | boolean goToNextRow() | 將結(jié)果集向后移動(dòng)一行。 |
ResultSet | boolean goToPreviousRow() | 將結(jié)果集向前移動(dòng)一行。 |
ResultSet | boolean isStarted() | 判斷結(jié)果集是否被移動(dòng)過。 |
ResultSet | boolean isEnded() | 判斷結(jié)果集當(dāng)前位置是否在最后一行之后。 |
ResultSet | boolean isAtFirstRow() | 判斷結(jié)果集當(dāng)前位置是否在第一行。 |
ResultSet | boolean isAtLastRow() | 判斷結(jié)果集當(dāng)前位置是否在最后一行。 |
ResultSet | int getRowCount() | 獲取當(dāng)前結(jié)果集中的記錄條數(shù)。 |
ResultSet | int getColumnCount() | 獲取結(jié)果集中的列數(shù)。 |
ResultSet | String getString(int columnIndex) | 獲取當(dāng)前行指定索列的值,以String類型返回。 |
ResultSet | byte[] getBlob(int columnIndex) | 獲取當(dāng)前行指定列的值,以字節(jié)數(shù)組形式返回。 |
ResultSet | double getDouble(int columnIndex) | 獲取當(dāng)前行指定列的值,以double型返回。 |
事務(wù)
關(guān)系型數(shù)據(jù)庫提供事務(wù)機(jī)制,來保證用戶操作的原子性。對單條數(shù)據(jù)進(jìn)行數(shù)據(jù)庫操作時(shí),無需開啟事務(wù);插入大量數(shù)據(jù)時(shí),開啟事務(wù)可以保證數(shù)據(jù)的準(zhǔn)確性。如果中途操作出現(xiàn)失敗,會(huì)執(zhí)行回滾操作。
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | beginTransaction() | 開啟事務(wù)。 |
RdbStore | markAsCommit() | 設(shè)置事務(wù)的標(biāo)記為成功。 |
RdbStore | endTransaction() | 結(jié)束事務(wù)。 |
事務(wù)和結(jié)果集觀察者
關(guān)系型數(shù)據(jù)庫提供了事務(wù)和結(jié)果集觀察者能力,當(dāng)對應(yīng)的事件被觸發(fā)時(shí),觀察者會(huì)收到通知。
類名 | 接口名 | 描述 |
---|---|---|
RdbStore | beginTransactionWithObserver(TransactionObserver transactionObserver) | 開啟事務(wù),并觀察事務(wù)的啟動(dòng)、提交和回滾。 |
ResultSet | void registerObserver(DataObserver observer) | 注冊結(jié)果集的觀察者。 |
ResultSet | void unregisterObserver(DataObserver observer) | 注銷結(jié)果集的觀察者。 |
數(shù)據(jù)庫的備份和恢復(fù)
用戶可以將當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行保存進(jìn)行備份,還可以在需要的時(shí)候進(jìn)行數(shù)據(jù)恢復(fù)。
類名 | 接口名稱 | 描述 |
---|---|---|
RdbStore | boolean restore(String srcName) | 數(shù)據(jù)庫恢復(fù)接口,從指定的非加密數(shù)據(jù)庫文件中恢復(fù)數(shù)據(jù)。 |
RdbStore | boolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey) | 數(shù)據(jù)庫恢復(fù)接口,從指定的數(shù)據(jù)庫文件(加密和非加密均可)中恢復(fù)數(shù)據(jù)。 |
RdbStore | boolean backup(String destName) | 數(shù)據(jù)庫備份接口,備份出的數(shù)據(jù)庫文件是非加密的。 |
RdbStore | boolean backup(String destName, byte[] destEncryptKey) | 數(shù)據(jù)庫備份接口,此方法經(jīng)常用在備份出加密數(shù)據(jù)庫場景。 |
示例代碼如下:
StoreConfig config = StoreConfig.newDefaultConfig("RdbStoreTest.db");
private static final RdbOpenCallback callback = new RdbOpenCallback() {
@Override
public void onCreate(RdbStore store) {
store.executeSql("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL, blobType BLOB)");
}
@Override
public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {
}
};
DatabaseHelper helper = new DatabaseHelper(context);
RdbStore store = helper.getRdbStore(config, 1, callback, null);
示例代碼如下:
ValuesBucket values = new ValuesBucket();
values.putInteger("id", 1);
values.putString("name", "zhangsan");
values.putInteger("age", 18);
values.putDouble("salary", 100.5);
values.putByteArray("blobType", new byte[] {1, 2, 3});
long id = store.insert("test", values);
示例代碼如下:
String[] columns = new String[] {"id", "name", "age", "salary"};
RdbPredicates rdbPredicates = new RdbPredicates("test").equalTo("age", 25).orderByAsc("salary");
ResultSet resultSet = store.query(rdbPredicates, columns);
resultSet.goToNextRow();
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: