HarmonyOS 數(shù)據(jù)庫系列之對象關(guān)系映射數(shù)據(jù)庫
前言
鴻蒙提供了非常強(qiáng)大的數(shù)據(jù)庫操作功能, 前面講到了 關(guān)系型數(shù)據(jù)庫, 是基于關(guān)系模型來管理數(shù)據(jù)的數(shù)據(jù)庫。
其實(shí)鴻蒙還有一種 體驗(yàn)更好,操作更方便的數(shù)據(jù)庫 ,對象關(guān)系映射數(shù)據(jù)庫, 這種數(shù)據(jù)庫的好處是 直接基于sqlite數(shù)據(jù)庫架構(gòu)的, 操作sql語句的操作更簡單,可以直接配置進(jìn)行。
其實(shí)這種配置更像做web后臺(tái)系統(tǒng)的開發(fā),一個(gè)類就是一個(gè)表,如果需要添加信息直接更新實(shí)體類就行。
簡介
先了解一下概念,概念是一切功能的使用總結(jié)。
HarmonyOS對象關(guān)系映射(Object Relational Mapping,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對實(shí)體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌凇?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句, 以操作對象的形式來操作數(shù)據(jù)庫,提升效率的同時(shí)也能聚焦于業(yè)務(wù)開發(fā)。
在我看來 對象關(guān)系映射數(shù)據(jù)庫非常重要的 三個(gè) 組件:
數(shù)據(jù)庫:被開發(fā)者用@Database注解,且繼承了OrmDatabase的類,對應(yīng)關(guān)系型數(shù)據(jù)庫。 實(shí)體對象:被開發(fā)者用@Entity注解,且繼承了OrmObject的類,對應(yīng)關(guān)系型數(shù)據(jù)庫中的表。 對象數(shù)據(jù)操作接口:包括數(shù)據(jù)庫操作的入口OrmContext類和謂詞接口(OrmPredicate)。
運(yùn)作機(jī)制

創(chuàng)建數(shù)據(jù)庫及其表
DatabaseHelper helper = new DatabaseHelper(this);OrmContext connect = helper.getOrmContext("UserDatabase", "UserDatabase.db", UserDatabase.class);
1、別名 2、數(shù)據(jù)庫名 3、對象-對應(yīng)關(guān)系型數(shù)據(jù)庫。
package com.hadiidbouk.databasemanager.database.object;import ohos.data.orm.OrmDatabase;import ohos.data.orm.annotation.Database;/*** Database*/@Database(entities = {User.class},version = 1)public abstract class UserDatabase extends OrmDatabase { }
數(shù)據(jù)對象:
/*** user Table*/@Entity(tableName = "user")public class User extends OrmObject {@PrimaryKey()private Long formId;private String formName;private Integer dimension;public User(Long formId, String formName, Integer dimension) {this.formId = formId;this.formName = formName;this.dimension = dimension;}public User() { }public Integer getDimension() {return dimension;}public void setDimension(Integer dimension) {this.dimension = dimension;}public Long getFormId() {return formId;}public void setFormId(Long formId) {this.formId = formId;}public String getFormName() {return formName;}public void setFormName(String formName) {this.formName = formName;}}
數(shù)據(jù)庫使用
/*** Database Operations** @since 2021-06-23*/public class DatabaseUtils {/*** add card info** @param form card object* @param connect data connection*/public static void insertForm(User form, OrmContext connect) {connect.insert(form);connect.flush();}/*** query database** @param connect data connection* @return database*/public static ListqueryForm(OrmContext connect){ // 從數(shù)據(jù)庫中獲取信息OrmPredicates ormPredicates = new OrmPredicates(User.class);// 搜索實(shí)例ListformList = connect.query(ormPredicates); if (formList.size() <= 0) {return formList;}for (User form : formList) {// 遍歷System.out.println("FormId = "+form.getFormId()+" = FormName"+form.getFormName()+" = Dimension"+form.getDimension());}return formList;}/*** update database** @param connect 數(shù)據(jù)庫實(shí)體* @param user user*/public static void updateForms(OrmContext connect,User user) {// 從數(shù)據(jù)庫中獲取信息ValuesBucket valuesBucket = new ValuesBucket();valuesBucket.putString("formName", user.getFormName());valuesBucket.putInteger("dimension", user.getDimension());OrmPredicates update = connect.where(User.class).equalTo("formId", user.getFormId());connect.update(update, valuesBucket);}/*** delete data** @param formId form id* @param connect data connection*/public static void deleteFormData(long formId, OrmContext connect) {OrmPredicates where = connect.where(User.class);where.equalTo("formId", formId); // 在數(shù)據(jù)庫的“user”表中查詢formId為“”的User對象列表Listquery = connect.query(where); if (!query.isEmpty()) {connect.delete(query.get(0));connect.flush();}}}
1、數(shù)據(jù)庫操作的入口OrmContext類 ,進(jìn)行數(shù)據(jù)庫操作 2、謂詞接口(OrmPredicate),進(jìn)行實(shí)例的制定(例如:條件查詢,條件刪除) 3、ValuesBucket 實(shí)例
操作使用:
public class DatabaseObjectAbility extends Ability implements Component.ClickedListener {private DatabaseHelper helper = new DatabaseHelper(this);private OrmContext connect;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_database_object);connect = helper.getOrmContext("UserDatabase", "UserDatabase.db", UserDatabase.class);findComponentById(ResourceTable.Id_xinzeng_db).setClickedListener(this);findComponentById(ResourceTable.Id_chaxun_db).setClickedListener(this);findComponentById(ResourceTable.Id_xiugai_db).setClickedListener(this);findComponentById(ResourceTable.Id_shagnchu_db).setClickedListener(this);}@Overridepublic void onClick(Component component) {switch (component.getId()){case ResourceTable.Id_xinzeng_db:insertDB();break;case ResourceTable.Id_chaxun_db:DatabaseUtils.queryForm(connect);break;case ResourceTable.Id_xiugai_db:User form = new User(100l, "陳建朋", 101);DatabaseUtils.updateForms(connect,form);break;case ResourceTable.Id_shagnchu_db:DatabaseUtils.deleteFormData(100l,connect);break;default:}}private void insertDB(){// 存儲(chǔ)卡片信息User form = new User(100l, "陳建朋", 101);try {DatabaseUtils.insertForm(form, connect);} catch (Exception e) {DatabaseUtils.deleteFormData(form.getFormId(), connect);}}
ohos {compileSdkVersion 5defaultConfig {compatibleSdkVersion 5}buildTypes {release {proguardOpt {proguardEnabled falserulesFiles 'proguard-rules.pro'}}}compileOptions { annotationEnabled true } // 數(shù)據(jù)庫使用必備}
感悟
逆鋒起筆是一個(gè)專注于程序員圈子的技術(shù)平臺(tái),你可以收獲最新技術(shù)動(dòng)態(tài)、最新內(nèi)測資格、BAT等大廠的經(jīng)驗(yàn)、精品學(xué)習(xí)資料、職業(yè)路線、副業(yè)思維,微信搜索逆鋒起筆關(guān)注!
