更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.com前言移动端开发,数据存储很重要,鸿蒙也不例外。说到数据存储,最重要的就是数据库。数据库的存储机制是否完善,提供的功能是否简单方便,将直接影响到开发者的开发速度和性能。作为鸿蒙的开发者,最近深入研究了鸿蒙数据库的知识点,了解了存储机制并尝试使用,发现鸿蒙的数据库果然应有尽有,而且操作还是简单的。概念首先,让我们看一下鸿蒙的关系数据库(RDB)概念。Harmony的RDB是一个基于关系模型管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了完整的本地数据库管理机制。它对外提供了一系列的增删改查接口。也可以直接运行用户输入的SQL语句,满足复杂场景。需要。HarmonyOS提供的关系型数据库,功能更齐全,查询效率更高。概念中的一句话非常重要。HarmonyOS提供的关系型数据库,功能更齐全,查询效率更高。当我看到这个时,我非常兴奋。作为开发者,我最想用的API不就是适用于任何情况吗?我们来看看鸿蒙数据库的运行机制。只有了解了机制,才能理解数据库开发的核心,也有利于扩展。运行机制HarmonyOS关系型数据库对外提供通用的运行接口。底层使用SQLite作为持久化存储引擎,支持SQLite的所有数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询、PrecompileSQL语句等。关系型数据库运行机制:鸿蒙数据库的上述运行机制不难发现。主要工作是在框架层做封装,然后调用JNI,使用SQLite组件。不管底层怎么开发,只要功能完善,体验到位,直接用鸿蒙应用不香吗?限制与限制1、数据库中连接池的最大数量为4个,用于管理用户的读写操作。连接池的数量是有限制的,最大是4个,但是4个就够用了。2.为保证数据的准确性,数据库一次只能支持一次写操作。同时支持一个写操作是非常重要的。为了防止数据存储的正确性,鸿蒙做了这个限制。但是作为一个多年的移动开发者,一般这种多操作或者大数据操作都会用到多线程。异步线程,或者放在线程池中,会更完美。数据库操作DataAbility鸿蒙在创建类的时候有一个DataAbility。不知道各位开发者有没有用过。其实这是针对数据库操作的。添加步骤非常简单:添加类时选择EmptyDataAbility。1、配置:添加类后,会自动生成如下配置:{"permissions":["com.huawei.codelab.DataAbilityShellProvider.PROVIDER"],"name":"com.hadiidbouk.databasemanager.database.DataAbility","icon":"$media:icon","description":"$string:dataability_description","type":"data","uri":"dataability://com.huawei.codelab.PersonDataAbility"}1.操作数据库权限信息"permissions"isrequired:["com.huawei.codelab.DataAbilityShellProvider.PROVIDER"]2.需要配置url。url很重要,在进行数据库表操作时必须保持一致。2、DataAbility操作内容默认创建的DataAbility类会自动重写对数据库的增删改查的几个操作函数。可以看下面:publicclassDataAbilityextendsAbility{privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(3,0xD001100,"Demo");privatestaticfinalStringDB_NAME="persondataability.db";privatestaticfinalStringDB_TAB_NAME="person";privatestaticfinalStringDB_COLUMN_PERSON_ID="id";privatestaticfinalStringDB_COLUMN_NAME="name";privatestaticfinalStringDB_COLUMN_GENDER="gender";privatestaticfinalStringDB_COLUMN_AGE="age";privatestaticfinalintDB_VERSION=1;privateStoreConfigconfig=StoreConfig.newDefaultConfig(DB_NAME);privateRdbStorerdbStore;privateRdbOpenCallbackrdbOpenCallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorestore){store.executeSql("createtableifnotexists"+DB_TAB_NAME+"("+DB_COLUMN_PERSON_ID+"integerprimarykey,"+DB_COLUMN_NAME+"textnotnull,"+DB_COLUMN_GENDER+"textnotnull,"+DB_COLUMN_AGE+"integer)");}@OverridepublicvoidonUpgrade(RdbStorestore,intoldVersion,intnewVersion){}};@OverridepublicvoidonStart(Intentintent){//创建数据库操作super.onStart(intent);HiLog.info(LABEL_LOG,"DataAbilityonStart");DatabaseHelperdatabaseHelper=newDatabaseHelper(this);rdbStore=databaseHelper.getRdbStore(config,DB_VERSION,rdbOpenCallback,null);}//数据库查询操作@OverridepublicResultSetquery(Uriuri,String[]columns,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_Storedbredicates(predicates,DB_TAB_Storedbredicates));,columns);if(resultSet==null){HiLog.info(LABEL_LOG,"resultSetisnull");}returnresultSet;}//数据库插入操作@Overridepublicintinsert(Uriuri,ValuesBucketvalue){HiLog.info(LABEL_LOG,"DataAbilityinsert");Stringpath=uri.getLastPath();if(!"person".equals(path)){HiLog.info(LABEL_LOG,"DataAbilityinsertpathisnotmatched");return-1;}ValuesBucketvalues=newValuesBucket();values.putInteger(DB_COLUMN_PERSON_ID,value.getInteger(DB_COLUMN_PERSON_ID));values.putString(DB_COLUMN_NAME,value.getString(DB_COLUMN_NAME));values.putString(DB_COLUMN_GENDER,value.getString(DB_COLUMN_GENDER));values.putInteger(DB_COLUMN_AGE,value.getInteger(DB_AGE));intindex=(int)rdbStore.insert(DB_TAB_NAME,values);DataAbilityHelper.creator(this,uri).notifyChange(uri);returnindex;}//数据库删除操作@Overridepublicintdelete(Uriuri,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_NAME);intindex=rdbStore.delete(rdbPredicates);HiLog.info(LABEL_LOG,"delete:"+index);DataAbilityHelper.creator(this,uri).notifyChange(uri);returnindex;}//数据库更新操作@Overridepublicintupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_NAME);intindex=rdbStore.update(value,rdbPredicates);HiLog.info(LABEL_LOG,"update:"+index);DataAbilityHelper.creator(this,uri).notifyChange(uri);returnindex;}@OverridepublicFileDescriptoropenFile(Uriuri,Stringmode){returnull;}@OverridepublicString[]getFileTypes(Uriuri,StringmimeTypeFilter){returnnewString[0];}@OverridepublicPacMapcall(Stringmethod,Stringarg,PacMaextras){returnull;}@OverridepublicStringgetType(Uriuri){returnnull;}}1.添加DataAbility会自动重写四个接口函数,与数据库增删改查相关2.运行后会显示DataAbilityproject自己执行onStart方法创建数据库及其数据表。3.使用RdbPredicates数据库关联数据库关系。3、数据库操作这里的数据库操作就是开发时需要做的数据库操作。大家可以根据自己的需要开发调用数据库的操作,最后直接使用DataAbility调用系统数据库。publicclassDataBaseAbilitySliceextendsAbilitySlice{privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(3,0xD001100,"Demo");privateDataAbilityHelperdatabaseHelper;privatestaticfinalStringBASE_URI="dataability:///com.huawei.codelab.PersonDataAbility";privatestaticfinalStringDATA_PATH="/person";privatestaticfinalStringDB_COLUMN_PERSON_ID="id";privatestaticfinalStringDB_COLUMN_NAME="名称";privatestaticfinalStringDB_COLUMN_GENDER="性别";privatestaticfinalStringDB_COLUMN_AGE="年龄";@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_data_base);databaseHelper=DataAbilityHelper.creator(this);Texttext=(Text)findComponentById(ResourceTable.Id_text_helloworld);text.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){query();insert(100,"Tom","male",20);insert(101,"Jerry","female",21);insert(102,"Bob","male",22);query();//查看插入后的结果update();query();//查看更新后的结果delete();query();//查看删除后的结果}});}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}privatevoidinsert(intid,Stringname,Stringgender,intage){ValuesBucketvaluesBucket=newValuesBucket();valuesBucket.putInteger(DB_COLUMN_PERSON_ID,id);valuesBucket.putString(DB_COLUMN_NAME,name);valuesBucket.putString(DB_COLUMN_GENDER,性别);valuesBucket.putInteger(DB_COLUMN_AGE));try{if(databaseHelper.insert(Uri.parse(BASE_URI+DATA_PATH),valuesBucket)!=-1){//if(databaseHelper.insert(Uri.parse(BASE_URI+DATA_PATH),valuesBucket)!=-1){HiLog.info(LABEL_LOG,"insertsuccessful");}}catch(DataAbilityRemoteException|IllegalStateExceptionexception){HiLog.error(LABEL_LOG,"插入:dataRemoteexception|illegalStateException");}}privatevoiddelete(){DataAbilityPredicatespredicates=newDataAbilityPredicates().equalTo(DB_COLUMN_PERSON_ID,100);try{if(databaseHelper.delete(Uri.parse(BASE_URI+DATA_PATH),predicates)!=-1){HiLog.info(LABEL_LOG,"deletesuccessful");}}catch(DataAbilityRemoteException|IllegalStateExceptionexception){HiLog.error(LABEL_LOG,"delete:dataRemoteexception|illegalStateException");}}privatevoidupdate(){DataAbilityPredicatespredicates=newDataAbilityPredicates();predicates.equalTo(DB_COLUMN_PERSON_ID,102);ValuesBucketvaluesBucket=newValuesBucket();valuesBucket.putString(DB_COLUMN_NAME,"ZhangSanPlus");valuesBucket.putInteger(DB_COLUMN_AGE,28);try{if(databaseHelper.update(Uri.parse(BASE_URI+DATA_PATH),valuesBucket,predicates)!=-1){HiLog.info(LABEL_LOG,"更新成功");}}catch(DataAbilityRemoteException|IllegalStateExceptionexception){HiLog.error(LABEL_LOG,"更新:dataRemoteexception|illegalStateException");}}privatevoidquery(){String[]columns=newString[]{DB_COLUMN_PERSON_ID,DB_COLUMN_NAME,DB_COLUMN_GENDER,DB_COLUMN_AGE};//构建查询条DataAbilityPredicatespredicates=newDataAbilityPredicates();predicates.between(DB_COLUMN_AGE,15,40);//查询库时间Uresult段reelSetry{解析(BASE_URI+DATA_PATH),列,谓词);if(resultSet==null||resultSet.getRowCount()==0){HiLog.info(LABEL_LOG,“查询:resultSetisnullornoresultfound”);返回;}resultSet.goToFirstRow();do{intid=resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_PERSON_ID));Stringname=resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_NAME));Stringgender=resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_GENDER));Set.intage=resultgetInt(resultSet.getColumnIndexForName(DB_COLUMN_AGE));HiLog.info(LABEL_LOG,"query:Id:"+id+"Name:"+name+"Gender:"+gender+"Age:"+age);}while(resultSet.goToNextRow());}catch(DataAbilityRemoteException|IllegalStateExceptionexception){HiLog.error(LABEL_LOG,"query:dataRemoteexception|illegalStateException");}}}1.数据插入使用对象类ValuesBucket2.此时使用DataAbilityPredicates实例设置数据查询条件。数据库的关系型数据库操作基本就搞定了,是不是非常非常简单,直接拿来验证就可以了
