HarmonyOS對(duì)象關(guān)系映射(Object Relational Mapping,ORM)數(shù)據(jù)庫(kù)是一款基于SQLite的數(shù)據(jù)庫(kù)框架,屏蔽了底層SQLite數(shù)據(jù)庫(kù)的SQL操作,針對(duì)實(shí)體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌?。?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句, 以操作對(duì)象的形式來操作數(shù)據(jù)庫(kù),提升效率的同時(shí)也能聚焦于業(yè)務(wù)開發(fā)。
基本概念
-
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)的三個(gè)主要組件:
- 數(shù)據(jù)庫(kù):被開發(fā)者用@Database注解,且繼承了OrmDatabase的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)。
- 實(shí)體對(duì)象:被開發(fā)者用@Entity注解,且繼承了OrmObject的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)中的表。
- 對(duì)象數(shù)據(jù)操作接口:包括數(shù)據(jù)庫(kù)操作的入口OrmContext類和謂詞接口(OrmPredicate)等。
-
謂詞
數(shù)據(jù)庫(kù)中用來代表數(shù)據(jù)實(shí)體的性質(zhì)、特征或者數(shù)據(jù)實(shí)體之間關(guān)系的詞項(xiàng),主要用來定義數(shù)據(jù)庫(kù)的操作條件。對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)將SQLite數(shù)據(jù)庫(kù)中的謂詞封裝成了接口方法供開發(fā)者調(diào)用。開發(fā)者通過對(duì)象數(shù)據(jù)操作接口,可以訪問到應(yīng)用持久化的關(guān)系型數(shù)據(jù)。
-
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)
通過將實(shí)例對(duì)象映射到關(guān)系上,實(shí)現(xiàn)操作實(shí)例對(duì)象的語法,來操作關(guān)系型數(shù)據(jù)庫(kù)。它是在SQLite數(shù)據(jù)庫(kù)的基礎(chǔ)上提供的一個(gè)抽象層。
-
SQLite數(shù)據(jù)庫(kù)
一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。
運(yùn)作機(jī)制
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)操作是基于關(guān)系型數(shù)據(jù)庫(kù)操作接口完成的,實(shí)際是在關(guān)系型數(shù)據(jù)庫(kù)操作的基礎(chǔ)上又實(shí)現(xiàn)了對(duì)象關(guān)系映射等特性。因此對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)跟關(guān)系型數(shù)據(jù)庫(kù)一樣,都使用SQLite作為持久化引擎,底層使用的是同一套數(shù)據(jù)庫(kù)連接池和數(shù)據(jù)庫(kù)連接機(jī)制。
使用對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)的開發(fā)者需要先配置實(shí)體模型與關(guān)系映射文件。應(yīng)用數(shù)據(jù)管理框架提供的類生成工具會(huì)解析這些文件,生成數(shù)據(jù)庫(kù)幫助類,這樣應(yīng)用數(shù)據(jù)管理框架就能在運(yùn)行時(shí),根據(jù)開發(fā)者的配置創(chuàng)建好數(shù)據(jù)庫(kù),并在存儲(chǔ)過程中自動(dòng)完成對(duì)象關(guān)系映射。開發(fā)者再通過對(duì)象數(shù)據(jù)操作接口,如OrmContext接口和謂詞接口等操作持久化數(shù)據(jù)庫(kù)。
對(duì)象數(shù)據(jù)操作接口提供一組基于對(duì)象映射的數(shù)據(jù)操作接口,實(shí)現(xiàn)了基于SQL的關(guān)系模型數(shù)據(jù)到對(duì)象的映射,讓用戶不需要再和復(fù)雜的 SQL語句打交道,只需簡(jiǎn)單地操作實(shí)體對(duì)象的屬性和方法。對(duì)象數(shù)據(jù)操作接口支持對(duì)象的增刪改查操作,同時(shí)支持事務(wù)操作等。
圖1?對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)運(yùn)作機(jī)制
?
默認(rèn)配置
- 如果不指定數(shù)據(jù)庫(kù)的日志模式,那么系統(tǒng)默認(rèn)日志方式是WAL(Write Ahead Log)模式。
- 如果不指定數(shù)據(jù)庫(kù)的落盤模式,那么系統(tǒng)默認(rèn)落盤方式是FULL模式。
- HarmonyOS數(shù)據(jù)庫(kù)使用的共享內(nèi)存默認(rèn)大小是2MB。
約束與限制
- 當(dāng)應(yīng)用使用對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)接口時(shí),應(yīng)用包和類的命名需要遵循典型的Java風(fēng)格(小寫包名,大駝峰類名)。
- HarmonyOS對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)是建立在HarmonyOS關(guān)系型數(shù)據(jù)庫(kù)的基礎(chǔ)之上。
- 此外當(dāng)開發(fā)者建立實(shí)體對(duì)象類時(shí),對(duì)象屬性的類型可以在下表的類型中選擇。不支持使用自定義類型。
類型名稱 |
描述 |
初始值 |
---|---|---|
Integer |
封裝整型 |
null |
int |
整型 |
0 |
Long |
封裝長(zhǎng)整型 |
null |
long |
長(zhǎng)整型 |
0L |
Double |
封裝雙精度浮點(diǎn)型 |
null |
double |
雙精度浮點(diǎn)型 |
0 |
Float |
封裝單精度浮點(diǎn)型 |
null |
float |
單精度浮點(diǎn)型 |
0 |
Short |
封裝短整型 |
null |
short |
短整型 |
0 |
String |
字符串型 |
null |
Boolean |
封裝布爾型 |
null |
boolean |
布爾型 |
0 |
Byte |
封裝字節(jié)型 |
null |
byte |
字節(jié)型 |
0 |
Character |
封裝字符型 |
null |
char |
字符型 |
' ' |
Date |
日期類 |
null |
Time |
時(shí)間類 |
null |
Timestamp |
時(shí)間戳類 |
null |
Calendar |
日歷類 |
null |
Blob |
二進(jìn)制大對(duì)象 |
null |
Clob |
字符大對(duì)象 |
null |
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)開發(fā)
場(chǎng)景介紹
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)適用于開發(fā)者使用的數(shù)據(jù)可以分解為一個(gè)或多個(gè)對(duì)象,且需要對(duì)數(shù)據(jù)進(jìn)行增刪改查等操作,但是不希望編寫過于復(fù)雜的SQL語句的場(chǎng)景。
該對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)的實(shí)現(xiàn)是基于關(guān)系型數(shù)據(jù)庫(kù),除了數(shù)據(jù)庫(kù)版本升降級(jí)等場(chǎng)景外,操作對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)一般不需要編寫SQL語句,但是仍然要求使用者對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的基本概念有一定的了解。
開發(fā)能力介紹
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)目前可以支持?jǐn)?shù)據(jù)庫(kù)和表的創(chuàng)建,對(duì)象數(shù)據(jù)的增刪改查、對(duì)象數(shù)據(jù)變化回調(diào)、數(shù)據(jù)庫(kù)升降級(jí)和備份等功能。
說明
對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)提供的接口在ohos.data.orm包中,使用該包中的接口時(shí),要求配置文件config.json的“app?>?bundleName”字段的值,不能包含大寫字母。
數(shù)據(jù)庫(kù)和表的創(chuàng)建
- 創(chuàng)建數(shù)據(jù)庫(kù)。開發(fā)者需要定義一個(gè)表示數(shù)據(jù)庫(kù)的類,繼承OrmDatabase,再通過@Database注解內(nèi)的entities屬性指定哪些數(shù)據(jù)模型類屬于這個(gè)數(shù)據(jù)庫(kù)。
屬性:
- version:數(shù)據(jù)庫(kù)版本號(hào)。
- entities:數(shù)據(jù)庫(kù)內(nèi)包含的表。
- 創(chuàng)建數(shù)據(jù)表。開發(fā)者可通過創(chuàng)建一個(gè)繼承了OrmObject并用@Entity注解的類,獲取數(shù)據(jù)庫(kù)實(shí)體對(duì)象,也就是表的對(duì)象。
屬性:
- tableName:表名。
- primaryKeys:主鍵名,一個(gè)表里只能有一個(gè)主鍵,一個(gè)主鍵可以由多個(gè)字段組成。
- foreignKeys:外鍵列表。
- indices:索引列表。
表1?注解對(duì)照表 接口名稱
描述
@Database
被@Database注解且繼承了OrmDatabase的類對(duì)應(yīng)數(shù)據(jù)庫(kù)類。
@Entity
被@Entity注解且繼承了OrmObject的類對(duì)應(yīng)數(shù)據(jù)表類。
@Column
被@Column注解的變量對(duì)應(yīng)數(shù)據(jù)表的字段。
@PrimaryKey
被@PrimaryKey注解的變量對(duì)應(yīng)數(shù)據(jù)表的主鍵。
@ForeignKey
被@ForeignKey注解的變量對(duì)應(yīng)數(shù)據(jù)表的外鍵。
@Index
被@Index注解的內(nèi)容對(duì)應(yīng)數(shù)據(jù)表索引的屬性。
打開數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)加密
- 打開數(shù)據(jù)庫(kù)。開發(fā)者通過getOrmContext打開數(shù)據(jù)庫(kù)。
表2?打開數(shù)據(jù)庫(kù)API 類名
接口名
描述
DatabaseHelper
DatabaseHelper(Context context)
DatabaseHelper是數(shù)據(jù)庫(kù)操作的輔助類,當(dāng)數(shù)據(jù)庫(kù)創(chuàng)建成功后,數(shù)據(jù)庫(kù)文件將存儲(chǔ)在由上下文指定的目錄里。
- 獲取上下文參考方法:context入?yún)㈩愋蜑閛hos.app.Context,注意不要使用slice.getContext()來獲取context,請(qǐng)直接傳入slice,否則會(huì)出現(xiàn)找不到類的報(bào)錯(cuò)。
- 查看詳細(xì)路徑信息:ohos.app.Context#getDatabaseDir()。
DatabaseHelper
public <T extends OrmDatabase> OrmContext getOrmContext(String alias, String name, Class<T> ormDatabase, OrmMigration... migrations)
打開數(shù)據(jù)庫(kù),alias數(shù)據(jù)庫(kù)別名,name數(shù)據(jù)庫(kù)名稱,ormDatabase數(shù)據(jù)庫(kù)對(duì)應(yīng)類,migrations數(shù)據(jù)庫(kù)升級(jí)類。
DatabaseHelper
public <T extends OrmDatabase> OrmContext getOrmContext(OrmConfig ormConfig, Class<T> ormDatabase, OrmMigration... migrations)
打開數(shù)據(jù)庫(kù),ormConfig數(shù)據(jù)庫(kù)配置,ormDatabase數(shù)據(jù)庫(kù)對(duì)應(yīng)類,migrations數(shù)據(jù)庫(kù)升級(jí)類。
DatabaseHelper
public OrmContext getOrmContext(String alias)
根據(jù)別名打開數(shù)據(jù)庫(kù)。
- 數(shù)據(jù)庫(kù)加密。對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)提供數(shù)據(jù)庫(kù)加密的能力,創(chuàng)建加密數(shù)據(jù)庫(kù)時(shí)傳入指定密鑰,后續(xù)打開加密數(shù)據(jù)庫(kù)時(shí),需要傳入正確密鑰。
表3?數(shù)據(jù)庫(kù)傳入密鑰API 類名
接口名
描述
OrmConfig.Builder
public OrmConfig.Builder setEncryptKey(byte[] encryptKey)
為數(shù)據(jù)庫(kù)配置類設(shè)置數(shù)據(jù)庫(kù)加密密鑰,創(chuàng)建或打開數(shù)據(jù)庫(kù)時(shí)傳入包含數(shù)據(jù)庫(kù)加密密鑰的配置類,即可創(chuàng)建或打開加密數(shù)據(jù)庫(kù)。
對(duì)象數(shù)據(jù)的增刪改查
通過對(duì)象數(shù)據(jù)操作接口,開發(fā)者可以對(duì)對(duì)象數(shù)據(jù)進(jìn)行增刪改查操作。
類名 |
接口名 |
描述 |
---|---|---|
OrmContext |
<T extends OrmObject> boolean insert(T object) |
添加方法。 |
OrmContext |
<T extends OrmObject> boolean update(T object) |
更新方法。 |
OrmContext |
<T extends OrmObject> List<T> query(OrmPredicates predicates) |
查詢方法。 |
OrmContext |
<T extends OrmObject> boolean delete(T object) |
刪除方法。 |
OrmContext |
<T extends OrmObject> OrmPredicates where(Class<T> clz) |
設(shè)置謂詞方法。 |
事務(wù)提交和回滾
對(duì)象關(guān)系型數(shù)據(jù)庫(kù)提供事務(wù)機(jī)制,來保證用戶操作的原子性。對(duì)單條數(shù)據(jù)進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),無需開啟事務(wù);插入大量數(shù)據(jù)時(shí),開啟事務(wù)可以保證數(shù)據(jù)的準(zhǔn)確性。如果中途操作出現(xiàn)失敗,會(huì)自動(dòng)執(zhí)行回滾操作。
類名 |
接口名 |
描述 |
---|---|---|
OrmContext |
void beginTransaction() |
開啟事務(wù)。 |
OrmContext |
void commit() |
事務(wù)提交。 |
OrmContext |
void rollback() |
事務(wù)回滾。 |
OrmContext |
boolean isInTransaction() |
是否正在執(zhí)行事務(wù)操作。 |
數(shù)據(jù)變化觀察者設(shè)置
通過使用對(duì)象數(shù)據(jù)操作接口,開發(fā)者可以在某些數(shù)據(jù)上設(shè)置觀察者,接收數(shù)據(jù)變化的通知。
類名 |
接口名 |
描述 |
---|---|---|
OrmContext |
void registerStoreObserver(String alias, OrmObjectObserver observer) |
注冊(cè)數(shù)據(jù)庫(kù)變化回調(diào)。 |
OrmContext |
void registerContextObserver(OrmContext watchedContext, OrmObjectObserver observer) |
注冊(cè)上下文變化回調(diào)。 |
OrmContext |
void registerEntityObserver(String entityName, OrmObjectObserver observer) |
注冊(cè)數(shù)據(jù)庫(kù)實(shí)體變化回調(diào)。 |
OrmContext |
void registerObjectObserver(OrmObject ormObject, OrmObjectObserver observer) |
注冊(cè)對(duì)象變化回調(diào)。 |
數(shù)據(jù)庫(kù)的升降級(jí)
通過調(diào)用數(shù)據(jù)庫(kù)升降級(jí)接口,開發(fā)者可以將數(shù)據(jù)庫(kù)切換到不同的版本。
類名 |
接口名 |
描述 |
---|---|---|
OrmMigration |
public OrmMigration(int beginVersion, int endVersion) |
數(shù)據(jù)庫(kù)升降級(jí)開始版本和結(jié)束版本。 |
OrmMigration |
public abstract void onMigrate( RdbStore store) |
數(shù)據(jù)庫(kù)版本升降級(jí)方法。 |
OrmMigration |
public int getBeginVersion() |
獲取開始版本。 |
OrmMigration |
public int getEndVersion() |
獲取結(jié)束版本。 |
數(shù)據(jù)庫(kù)的備份恢復(fù)
開發(fā)者可以將當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行備份,在必要的時(shí)候進(jìn)行數(shù)據(jù)恢復(fù)。
類名 |
接口名稱 |
描述 |
---|---|---|
OrmContext |
boolean backup(String destPath) |
數(shù)據(jù)庫(kù)備份方法。 |
OrmContext |
boolean restore(String srcPath) |
數(shù)據(jù)庫(kù)恢復(fù)備份方法。 |
開發(fā)步驟
配置“build.gradle”文件。
- 如果使用注解處理器的模塊為“com.huawei.ohos.hap”模塊,則需要在模塊的“build.gradle”文件的ohos節(jié)點(diǎn)中添加以下配置:
compileOptions{
annotationEnabled true
}
- 如果使用注解處理器的模塊為“com.huawei.ohos.library”模塊,則需要在模塊的“build.gradle”文件的“dependencies”節(jié)點(diǎn)中配置注解處理器。
- 查看“orm_annotations_java.jar”、“orm_annotations_processor_java.jar” 、“javapoet_java.jar”這3個(gè)jar包在HUAWEI SDK中的Sdk/java/x.x.x.xx/build-tools/lib/目錄,并將目錄的這三個(gè)jar包導(dǎo)進(jìn)來。
dependencies {
compile files("orm_annotations_java.jar的路徑", "orm_annotations_processor_java.jar的路徑", "javapoet_java.jar的路徑")
annotationProcessor files("orm_annotations_java.jar的路徑", "orm_annotations_processor_java.jar的路徑", "javapoet_java.jar的路徑")
}
- 如果使用注解處理器的模塊為“java-library”模塊,則需要在模塊的“build.gradle”文件的dependencies節(jié)點(diǎn)中配置注解處理器,并導(dǎo)入“ohos.jar”。
dependencies {
compile files("ohos.jar的路徑","orm_annotations_java.jar的路徑","orm_annotations_processor_java.jar的路徑","javapoet_java.jar的路徑")
annotationProcessor files("orm_annotations_java.jar的路徑","orm_annotations_processor_java.jar的路徑","javapoet_java.jar的路徑")
}
構(gòu)造數(shù)據(jù)庫(kù),即創(chuàng)建數(shù)據(jù)庫(kù)類并配置對(duì)應(yīng)的屬性。
例如,定義了一個(gè)數(shù)據(jù)庫(kù)類BookStore.java,數(shù)據(jù)庫(kù)包含了“User”,"Book","AllDataType"三個(gè)表,版本號(hào)為“1”。數(shù)據(jù)庫(kù)類的getVersion方法和getHelper方法不需要實(shí)現(xiàn),直接將數(shù)據(jù)庫(kù)類設(shè)為虛類即可。
@Database(entities = {User.class, Book.class, AllDataType.class}, version = 1)
public abstract class BookStore extends OrmDatabase {
}
構(gòu)造數(shù)據(jù)表,即創(chuàng)建數(shù)據(jù)庫(kù)實(shí)體類并配置對(duì)應(yīng)的屬性(如對(duì)應(yīng)表的主鍵,外鍵等)。數(shù)據(jù)表必須與其所在的數(shù)據(jù)庫(kù)在同一個(gè)模塊中。
例如,定義了一個(gè)實(shí)體類User.java,對(duì)應(yīng)數(shù)據(jù)庫(kù)內(nèi)的表名為“user”;indices 為“firstName”和“l(fā)astName”兩個(gè)字段建立了復(fù)合索引“name_index”,并且索引值是唯一的;“ignoredColumns”表示該字段不需要添加到“user”表的屬性中。
@Entity(tableName = "user", ignoredColumns = {"ignoredColumn1", "ignoredColumn2"},
indices = {@Index(value = {"firstName", "lastName"}, name = "name_index", unique = true)})
public class User extends OrmObject {
// 此處將userId設(shè)為了自增的主鍵。注意只有在數(shù)據(jù)類型為包裝類型時(shí),自增主鍵才能生效。
@PrimaryKey(autoGenerate = true)
private Integer userId;
private String firstName;
private String lastName;
private int age;
private double balance;
private int ignoredColumn1;
private int ignoredColumn2;
// 需添加各字段的getter和setter方法。
}
說明
示例中的getter & setter 的方法名為小駝峰格式,除了手寫方法,IDE中包含自動(dòng)生成getter和setter方法的Generate插件。
- 當(dāng)變量名的格式類似“firstName”時(shí),getter和setter方法名應(yīng)為“getFirstName”和“setFirstName”。
- 當(dāng)變量名的格式類似“mAge”,即第一個(gè)字母小寫,第二個(gè)字母大寫的格式時(shí),getter和setter方法名應(yīng)為“getmAge”和“setmAge”。
- 當(dāng)變量名格式類似“x”,即只有一個(gè)字母時(shí),getter和setter方法名應(yīng)為“getX”和“setX”。
變量為boolean類型時(shí),上述規(guī)則仍然成立,即“isFirstName”,“ismAge”,“isX”。
使用對(duì)象數(shù)據(jù)操作接口OrmContext創(chuàng)建數(shù)據(jù)庫(kù)。
例如,通過對(duì)象數(shù)據(jù)操作接口OrmContext,創(chuàng)建一個(gè)別名為“BookStore”,數(shù)據(jù)庫(kù)文件名為“BookStore.db”的數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)存在,執(zhí)行以下代碼不會(huì)重復(fù)創(chuàng)建。通過context.getDatabaseDir()可以獲取創(chuàng)建的數(shù)據(jù)庫(kù)文件所在的目錄。
// context入?yún)㈩愋蜑閛hos.app.Context,注意不要使用slice.getContext()來獲取context,請(qǐng)直接傳入slice,否則會(huì)出現(xiàn)找不到類的報(bào)錯(cuò)。
DatabaseHelper helper = new DatabaseHelper(this);
OrmContext context = helper.getOrmContext("BookStore", "BookStore.db", BookStore.class);
(可選)數(shù)據(jù)庫(kù)升降級(jí)。如果開發(fā)者有多個(gè)版本的數(shù)據(jù)庫(kù),通過設(shè)置數(shù)據(jù)庫(kù)版本遷移類可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本升降級(jí)。
數(shù)據(jù)庫(kù)版本升降級(jí)的調(diào)用示例如下。其中BookStoreUpgrade類也是一個(gè)繼承了OrmDatabase的數(shù)據(jù)庫(kù)類,與BookStore類的區(qū)別在于配置的版本號(hào)不同。
OrmContext context = helper.getOrmContext("BookStore",
"BookStore.db",
BookStoreUpgrade.class,
new TestOrmMigration32(),
new TestOrmMigration23(),
new TestOrmMigration12(),
new TestOrmMigration21());
TestOrmMigration12的實(shí)現(xiàn)示例如下:
private static class TestOrmMigration12 extends OrmMigration {
// 此處用于配置數(shù)據(jù)庫(kù)版本遷移的開始版本和結(jié)束版本,super(startVersion, endVersion)即數(shù)據(jù)庫(kù)版本號(hào)從1升到2。
public TestOrmMigration12() {super(1, 2); }
@Override
public void onMigrate(RdbStore store) {
store.executeSql("ALTER TABLE `Book` ADD COLUMN `addColumn12` INTEGER");
}
}
說明
數(shù)據(jù)庫(kù)版本遷移類的開始版本和結(jié)束版本必須是連續(xù)的。
- 如果BookStore.db的版本號(hào)為“1”,BookStoreUpgrade.class的版本號(hào)為“2”時(shí),TestOrmMigration12類的onMigrate方法會(huì)被自動(dòng)回調(diào)。
- 如果BookStore.db的版本號(hào)為“1”,BookStoreUpgrade.class版本號(hào)為“3”時(shí),TestOrmMigration12類和TestOrmMigration23類的onMigrate方法會(huì)依次被回調(diào)。
使用對(duì)象數(shù)據(jù)操作接口OrmContext對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查、注冊(cè)觀察者、備份數(shù)據(jù)庫(kù)等。
- 更新或刪除數(shù)據(jù),分為兩種情況:
- 通過直接傳入OrmObject對(duì)象的接口來更新數(shù)據(jù),需要先從表中查到需要更新的User對(duì)象列表,然后修改對(duì)象的值,再調(diào)用更新接口持久化到數(shù)據(jù)庫(kù)中。刪除數(shù)據(jù)與更新數(shù)據(jù)的方法類似,只是不需要更新對(duì)象的值。
例如,更新“user”表中age為“29”的行,需要先查找“user”表中對(duì)應(yīng)數(shù)據(jù),得到一個(gè)User的列表。然后選擇列表中需要更新的User對(duì)象(如第0個(gè)對(duì)象),設(shè)置需要更新的值,并調(diào)用update接口傳入被更新的User對(duì)象。最后調(diào)用flush接口持久化到數(shù)據(jù)庫(kù)中。文章來源:http://www.zghlxwxcb.cn/news/detail-537871.html
- 通過直接傳入OrmObject對(duì)象的接口來更新數(shù)據(jù),需要先從表中查到需要更新的User對(duì)象列表,然后修改對(duì)象的值,再調(diào)用更新接口持久化到數(shù)據(jù)庫(kù)中。刪除數(shù)據(jù)與更新數(shù)據(jù)的方法類似,只是不需要更新對(duì)象的值。
// 更新數(shù)據(jù)
OrmPredicates predicates = context.where(User.class);
predicates.equalTo("age", 29);
List<User> users = context.query(predicates);
User user = users.get(0);
user.setFirstName("Li");
context.update(user);
context.flush();
// 刪除數(shù)據(jù)
OrmPredicates predicates = context.where(User.class);
predicates.equalTo("age", 29);
List<User> users = context.query(predicates);
User user = users.get(0);
context.delete(user);
context.flush();
- 通過傳入謂詞的接口來更新和刪除數(shù)據(jù),方法與OrmObject對(duì)象的接口類似,只是無需flush就可以持久化到數(shù)據(jù)庫(kù)中。
ValuesBucket valuesBucket = new ValuesBucket();
valuesBucket.putInteger("age", 31);
valuesBucket.putString("firstName", "ZhangU");
valuesBucket.putString("lastName", "SanU");
valuesBucket.putDouble("balance", 300.51);
OrmPredicates update = context.where(User.class).equalTo("userId", 1);
context.update(update, valuesBucket);
- 查詢數(shù)據(jù)。在數(shù)據(jù)庫(kù)的“user”表中查詢lastName為“San”的User對(duì)象列表,示例如下:
OrmPredicates query = context.where(User.class).equalTo("lastName", "San");
List<User> users = context.query(query);
- 注冊(cè)觀察者。
// 定義一個(gè)觀察者類。
private class CustomedOrmObjectObserver implements OrmObjectObserver {
@Override
public void onChange(OrmContext changeContext, AllChangeToTarget subAllChange) {
// 用戶可以在此處定義觀察者行為
}
}
// 調(diào)用registerEntityObserver方法注冊(cè)一個(gè)觀察者observer。
CustomedOrmObjectObserver observer = new CustomedOrmObjectObserver();
context.registerEntityObserver("user", observer);
// 當(dāng)以下方法被調(diào)用,并flush成功時(shí),觀察者observer的onChange方法會(huì)被觸發(fā)。其中,方法的入?yún)⒈仨殲閁ser類的對(duì)象。
public <T extends OrmObject> boolean insert(T object)
public <T extends OrmObject> boolean update(T object)
public <T extends OrmObject> boolean delete(T object)
- 備份數(shù)據(jù)庫(kù)。其中原數(shù)據(jù)庫(kù)名為“OrmTest.db”,備份數(shù)據(jù)庫(kù)名為“OrmBackup.db”。
OrmContext context = helper.getObjectContext("OrmTest", "OrmTest.db", BookStore.class);
context.backup("OrmBackup.db");
context.close();
刪除數(shù)據(jù)庫(kù),例如刪除OrmTest.db。文章來源地址http://www.zghlxwxcb.cn/news/detail-537871.html
helper.deleteRdbStore("OrmTest.db");
到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開發(fā)篇—數(shù)據(jù)管理(對(duì)象關(guān)系映射數(shù)據(jù)庫(kù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!