当前位置: 首页 > 科技观察

简单使用DataAbility进行数据库操作

时间:2023-03-18 00:20:04 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.comDataAbility简介:能够使用数据模板(以下简称“数据”)帮助应用程序管理自己和其他应用程序存储的数据访问,并提供与其他应用程序共享数据的方法。数据不仅可以用于同一设备上不同应用程序之间的数据共享,还可以用于跨设备的不同应用程序之间的数据共享。数据可以以各种形式存储,例如数据库或磁盘上的文件。数据对外提供增删改查数据、文件打开等接口。这些接口的具体实现由开发者提供。效果展示:介绍DataAbility的使用,对数据库进行数据访问操作。每次插入的数据为:id=自增主键;name=jack;age=23;salary=3456.0。修改数据:修改id为2的数据,修改数据为:name=rose;age=45;salary=1234.9。删除数据:删除id为1的数据。查询数据:查询表中的所有数据,并按行显示。创建一个新的DataAbility初始化数据库操作。这里我们以关系型数据库为例,在DataAbility的onStart方法中初始化数据库、表、字段的相关操作:关系型数据库和对象型数据库的基本操作可以看这篇文章:https://ost.51cto.com/posts/10599。//数据库操作类RdbStoreprivateRdbStorerdbStore;//表示privatefinalStringTABLENAME="student";@OverridepublicvoidonStart(Intentintent){super.onStart(intent);HiLog.info(LABEL_LOG,"DataAbilityonStart");initDatabase(this);}//初始数据库privatevoidinitDatabase(Contextcontext){StoreConfigconfig=StoreConfig.newDefaultConfig("Student.db");RdbOpenCallbackcallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorerdbStore){rdbStore.executeSql("如果不存在则创建表"+TABLENAME+"(idinteger主键自增,nametextnotnull,ageintegernotnull,实际工资)");}@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){}};DatabaseHelperhelper=newDatabaseHelper(context);rdbStore=helper.getRdbStore(config,1,callback);}实现DataAbility类内部的增删改查操作在DataAbility提供的相应的增删改查方法中实现;这里我们使用关系型数据库RdbStore进行查询、修改、删除操作,参数RdbPredicates需要通过DataAbilityUtils类和DataAbilityPredicates对象进行转换。//查询数据@OverridepublicResultSetquery(Uriuri,String[]columns,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,TABLENAME);结果集resultSet=rdbStore.query(rdbPredicates,columns);returnresultSet;}//插入数据@Overridepublicintinsert(Uriuri,ValuesBucketvalue){longres=rdbStore.insert(TABLENAME,value);return(int)res;}//删除数据@Overridepublicintdelete(Uriuri,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,TABLENAME);intres=rdbStore.delete(rdbPredicates);returnres;}//修改数据@Overridepublicintupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicatespredicates){RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,TABLENAME);intres=rdbStore.update(value,rdbPredicates);returnres;}URI介绍Data的提供方式和使用方式都通过URI(UniformResourceIdentifier))来标识特定数据,例如数据库中的某个表或磁盘上的某个文件。HarmonyOS的URI还是基于通用的URI标准,格式如下:使用的协议类型。authority:设备ID。如果是跨设备场景,就是目标设备的ID;如果是本地设备场景,则不需要填写。path:资源的路径信息,表示特定资源的位置信息。查询:查询参数。fragment:可以用来表示要访问的子资源。URI示例:跨设备场景:dataability://device_id/com.domainname.dataability.persondata/person/10。本地设备:dataability:///com.domainname.dataability.persondata/person/10。表示本地设备的“device_id”字段为空,所以“dataability:”后面有三个“/”。使用DataAbilityHelper对象调用DataAbility的增删改查操作:在切片中声明全局变量DataAbilityHelper和Uri的对象,使页面可以进行增删改查操作。1.获取Uri的值:2.在slice的onStart方法中初始化一个DataAbilityHelper和Uri对象。注意:由于是在本地机器上操作,本地设备的“device_id”字段为空,所以“dataability:”后面有三个“/”。//访问DataAbility的唯一路径privateUriuri;//DataAbility数据操作类privateDataAbilityHelperhelper;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);helper=DataAbilityHelper.creator(this);uri=Uri.parse("dataability:///com.example.myapplication.DataAbility");}新数据://增加privatebooleanaddData(){ValuesBucketbucket=newValuesBucket();bucket.putString("姓名","杰克");bucket.putInteger("年龄",23);bucket.putDouble("工资",3456.0);尝试{introwNum=helper.insert(uri,bucket);返回rowNum>0?真假;}catch(Exceptione){}returnfalse;}删除数据://删除privatebooleandeleteData(){try{DataAbilityPredicatespredicates=newDataAbilityPredicates();predicates.equalTo("id",1);introwNum=helper.delete(uri,谓词);返回rowNum>0?真假;}抓住(异常e){}returnfalse;}修改数据://修改privatebooleanchangeData(){ValuesBucketbucket=newValuesBucket();bucket.putString("姓名","玫瑰");bucket.putInteger("年龄",45);bucket.putDouble("工资",1234.9);尝试{DataAbilityPredicates谓词=newDataAbilityPredicates();predicates.equalTo("id",2);introwNum=helper.update(uri,bucket,predicates);返回rowNum>0?真假;}catch(Exceptione){}returnfalse;}查询数据://queryprivateResultSetqueryData(){String[]strings={"id","name","age","salary"};DataAbilityPredicates谓词=newDataAbilityPredicates();谓词。大于("id",0);尝试{结果集resultSet=helper.查询(uri、字符串、谓词);返回结果集;}catch(Exceptione){}returnnull;}总结DataAbility只是华为提供的一个接口,用于同一设备上的应用程序之间或不同设备之间的数据访问。具体的数据持久化还是要看数据库或者其他文件类型。RdbPredicates需要从DataAbilityUtils类和DataAbilityPredicates对象转换而来。数据提供者和用户都使用URI(统一资源标识符)来标识一个特定的数据,比如数据库中的一个表或者磁盘上的一个文件。访问本机应用的数据库时,本地设备的“device_id”字段为空,所以“dataability:”后面有三个“/”。调用切片页面DataAbilityHelper对象的接口进行数据操作。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com