访问Data
开发者可以通过DataAbilityHelper类来访问当前应用或其他应用提供的共享数据。DataAbilityHelper作为客户端,与提供方的Data进行通信。Data接收到请求后,执行相应的处理,并返回结果。DataAbilityHelper提供了一系列与Data Ability对应的方法。
下面介绍DataAbilityHelper具体的使用步骤。
声明使用权限
如果待访问的Data声明了访问需要权限,则访问此Data需要在配置文件中声明需要此权限。声明请参考权限申请字段说明。
"reqPermissions": [ { "name": "com.example.myapplication5.DataAbility.DATA" }, // 访问文件还需要添加访问存储读写权限 { "name": "ohos.permission.READ_USER_STORAGE" }, { "name": "ohos.permission.WRITE_USER_STORAGE" }]
创建DataAbilityHelper
DataAbilityHelper为开发者提供了creator()方法来创建DataAbilityHelper实例。该方法为静态方法,有多个重载。最常见的方法是通过传入一个context对象来创建DataAbilityHelper对象。
获取helper对象示例:
DataAbilityHelper helper = DataAbilityHelper.creator(this);
访问Data Ability
DataAbilityHelper为开发者提供了一系列的接口来访问不同类型的数据(文件、数据库等)。
访问文件
DataAbilityHelper为开发者提供了FileDescriptor openFile(Uri uri, String mode)方法来操作文件。此方法需要传入两个参数,其中uri用来确定目标资源路径,mode用来指定打开文件的方式,可选方式包含“r”(读), “w”(写), “rw”(读写),“wt”(覆盖写),“wa”(追加写),“rwt”(覆盖写且可读)。
该方法返回一个目标文件的FD(文件描述符),把文件描述符封装成流,开发者就可以对文件流进行自定义处理。
访问文件示例:
// 读取文件描述符FileDescriptor fd = helper.openFile(uri, "r");FileInputStream fis = new FileInputStream(fd); // 使用文件描述符封装成的文件流,进行文件操作
访问数据库
DataAbilityHelper为开发者提供了增、删、改、查以及批量处理等方法来操作数据库。
说明
对数据库的操作方法,详见数据管理中各数据库类型的开发指南。
| 方法 | 描述 | | ------------------------------------------------------------ | ---------------------- | | ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) | 查询数据库 | | int insert(Uri uri, ValuesBucket value) | 向数据库中插入单条数据 | | int batchInsert(Uri uri, ValuesBucket[] values) | 向数据库中插入多条数据 | | int delete(Uri uri, DataAbilityPredicates predicates) | 删除一条或多条数据 | | int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) | 更新数据库 | | DataAbilityResult[] executeBatch(ArrayList
operations) | 批量操作数据库 | 这些方法的使用说明如下:
query()
查询方法,其中uri为目标资源路径,columns为想要查询的字段。开发者的查询条件可以通过DataAbilityPredicates来构建。查询用户表中id在101-103之间的用户,并把结果打印出来,代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(this); // 构造查询条件DataAbilityPredicates predicates = new DataAbilityPredicates();predicates.between("userId", 101, 103); // 进行查询ResultSet resultSet = helper.query(uri, columns, predicates); // 处理结果resultSet.goToFirstRow();do { // 在此处理ResultSet中的记录;} while(resultSet.goToNextRow());
insert()
新增方法,其中uri为目标资源路径,ValuesBucket为要新增的对象。插入一条用户信息的代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(this); // 构造插入数据ValuesBucket valuesBucket = new ValuesBucket();valuesBucket.putString("name", "Tom");valuesBucket.putInteger("age", 12);helper.insert(uri, valuesBucket);
batchInsert()
批量插入方法,和insert()类似。批量插入用户信息的代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(this); // 构造插入数据ValuesBucket[] values = new ValuesBucket[2];values[0] = new ValuesBucket();values[0].putString("name", "Tom");values[0].putInteger("age", 12);values[1] = new ValuesBucket();values[1].putString("name", "Tom1");values[1].putInteger("age", 16);helper.batchInsert(uri, values);
delete()
删除方法,其中删除条件可以通过DataAbilityPredicates来构建。删除用户表中id在101-103之间的用户,代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(this); // 构造删除条件DataAbilityPredicates predicates = new DataAbilityPredicates();predicates.between("userId", 101, 103);helper.delete(uri, predicates);
update()
更新方法,更新数据由ValuesBucket传入,更新条件由DataAbilityPredicates来构建。更新id为102的用户,代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(this); // 构造更新条件DataAbilityPredicates predicates = new DataAbilityPredicates();predicates.equalTo("userId", 102); // 构造更新数据ValuesBucket valuesBucket = new ValuesBucket();valuesBucket.putString("name", "Tom");valuesBucket.putInteger("age", 12);helper.update(uri, valuesBucket, predicates);
executeBatch()
此方法用来执行批量操作。DataAbilityOperation中提供了设置操作类型、数据和操作条件的方法,开发者可自行设置自己要执行的数据库操作。插入多条数据的代码示例如下:
DataAbilityHelper helper = DataAbilityHelper.creator(abilityObj, insertUri); // 构造批量操作ValuesBucket value1 = initSingleValue();DataAbilityOperation opt1 = DataAbilityOperation.newInsertBuilder(insertUri).withValuesBucket(value1).build();ValuesBucket value2 = initSingleValue2();DataAbilityOperation opt2 = DataAbilityOperation.newInsertBuilder(insertUri).withValuesBucket(value2).build();ArrayList<DataAbilityOperation> operations = new ArrayList<DataAbilityOperation>();operations.add(opt1);operations.add(opt2);DataAbilityResult[] result = helper.executeBatch(insertUri, operations);
相关实例
针对Data Ability开发,有以下示例工程可供参考:
DataAbility
本示例演示了如何使用Data Ability对数据库进行增、删、改、查,以及读取文本文件。
针对Data Ability开发,有以下Codelabs可供参考:
关系型数据库
基于Data Ability的关系型数据库和数据管理能力,实现数据库相关应用服务的快速开发。