社区编辑申请
注册/登录
DataAbility进行数据库操作的简单使用
系统 OpenHarmony
数据的存放形式多样,可以是数据库,也可以是磁盘上的文件。Data对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

DataAbility介绍:

使用Data模板的Ability(以下简称“Data”)有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

数据的存放形式多样,可以是数据库,也可以是磁盘上的文件。Data对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供。

效果展示:

介绍DataAbility的使用方法,对数据库进行数据的访问操作。

  1. 每次插入的数据为:id=自增长主键;name=jack;age=23;salary=3456.0。
  2. 修改数据:修改id为2的数据,并把数据改为:name=rose;age=45;salary=1234.9。
  3. 删除数据:删除id为1的那一条数据。
  4. 查询数据:查询表中所有的数据,并且分行显示。

新建一个DataAbility

初始化数据库操作

我们这里以关系型数据库为例,在DataAbility的onStart方法里边初始化数据库、表和字段的相关操作:

对于关系型数据库和对象型数据库的基本操作,可以看这一篇文章:

https://ost.51cto.com/posts/10599。

// 数据库操作类RdbStore
private RdbStore rdbStore;
// 表名称
private final String TABLENAME = "student";
@Override
public void onStart(Intent intent) {
super.onStart(intent);
HiLog.info(LABEL_LOG, "DataAbility onStart");

initDatabase(this);
}
// 初始化数据库
private void initDatabase(Context context){
StoreConfig config = StoreConfig.newDefaultConfig("Student.db");
RdbOpenCallback callback = new RdbOpenCallback() {
@Override
public void onCreate(RdbStore rdbStore) {
rdbStore.executeSql("create table if not exists " + TABLENAME + "(id integer primary key autoincrement, name text not null, age integer not null, salary real)");
}
@Override
public void onUpgrade(RdbStore rdbStore, int i, int i1) {
}
};
DatabaseHelper helper = new DatabaseHelper(context);
rdbStore = helper.getRdbStore(config, 1, callback);
}

实现DataAbility类内部的增删改查操作

在DataAbility提供对应的增删改查方法里,实现数据库的的增删改查操作;这里我们使用的是关系型数据库。

RdbStore进行查询、修改、删除等操作时,参数RdbPredicates需要由DataAbilityUtils类和DataAbilityPredicates对象转换得来。

// 查询数据
@Override
public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
ResultSet resultSet = rdbStore.query(rdbPredicates, columns);
return resultSet;
}
// 插入数据
@Override
public int insert(Uri uri, ValuesBucket value) {
long res = rdbStore.insert(TABLENAME, value);
return (int)res;
}
// 删除数据
@Override
public int delete(Uri uri, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
int res = rdbStore.delete(rdbPredicates);
return res;
}
// 修改数据
@Override
public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
int res = rdbStore.update(value, rdbPredicates);
return res;
}

URI介绍

Data的提供方和使用方都通过URI(Uniform Resource Identifier)来标识一个具体的数据,例如数据库中的某个表或磁盘上的某个文件。HarmonyOS的URI仍基于URI通用标准,格式如下:

  • scheme:协议方案名,固定为“dataability”,代表Data Ability所使用的协议类型。
  • authority:设备ID。如果为跨设备场景,则为目标设备的ID;如果为本地设备场景,则不需要填写。
  • path:资源的路径信息,代表特定资源的位置信息。
  • query:查询参数。
  • fragment:可以用于指示要访问的子资源。

URI示例:

  • 跨设备场景:dataability://device_id/com.domainname.dataability.persondata/person/10。
  • 本地设备:dataability:///com.domainname.dataability.persondata/person/10。

说明

本地设备的“device_id”字段为空,因此在“dataability:”后面有三个“/”。

使用DataAbilityHelper对象调用DataAbility的增删改查操作:

在slice里边声明全局变量DataAbilityHelper和Uri的对象,以便页面进行增删改查的操作。

1、获取Uri的值:

2、在slice的onStart方法初始化一个DataAbilityHelper和Uri对象。

注意:由于是对本机操作,本地设备的“device_id”字段为空,因此在“dataability:”后面有三个“/”。

// 访问DataAbility的唯一路径
private Uri uri;
// DataAbility数据操作类
private DataAbilityHelper helper;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
helper = DataAbilityHelper.creator(this);
uri = Uri.parse("dataability:///com.example.myapplication.DataAbility");
}

新增数据:

// 增加
private boolean addData(){
ValuesBucket bucket = new ValuesBucket();
bucket.putString("name", "jack");
bucket.putInteger("age", 23);
bucket.putDouble("salary", 3456.0);
try {
int rowNum = helper.insert(uri, bucket);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}

删除数据:

// 删除
private boolean deleteData(){
try {
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", 1);
int rowNum = helper.delete(uri,predicates);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}

修改数据:

// 修改
private boolean changeData(){
ValuesBucket bucket = new ValuesBucket();
bucket.putString("name", "rose");
bucket.putInteger("age", 45);
bucket.putDouble("salary", 1234.9);
try {
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", 2);
int rowNum = helper.update(uri, bucket, predicates);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}

查询数据:

// 查询
private ResultSet queryData(){
String[] strings = {
"id","name","age","salary"
};
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.greaterThan("id", 0);
try {
ResultSet resultSet = helper.query(uri, strings, predicates);
return resultSet;
} catch (Exception e) {
}
return null;
}

总结

  1. DataAbility只是华为提供的同设备或不同设备之间的应用进行数据访问的接口,具体的数据持久化保存还是要依赖于数据库或者其他文件类型。
  2. RdbPredicates需要由DataAbilityUtils类和DataAbilityPredicates对象转换得来。
  3. Data的提供方和使用方都通过URI(Uniform Resource Identifier)来标识一个具体的数据,例如数据库中的某个表或磁盘上的某个文件。
  4. 当访问本机应用的数据库时,本地设备的“device_id”字段为空,因此在“dataability:”后面有三个“/”。
  5. 在slice页面调用DataAbilityHelper对象的接口进行数据操作。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-07-29 14:03:35

2022-04-19 14:41:29

Oracle数据库SQL

2022-04-25 14:41:15

甲骨文数据库机数据库

2022-05-24 15:06:57

AbilityeTS FA鸿蒙

2022-05-24 14:26:11

云原生数据库云架构

2022-05-06 10:58:55

数据库智能诊断

2022-05-17 11:06:44

数据库MySQL系统

2022-03-25 09:04:01

Mysql数据库

2022-05-16 13:37:12

Sysrv僵尸网络微软

2022-04-01 11:41:00

智能技术数据库数据安全

2022-05-10 10:02:51

2022-04-14 13:48:33

MySQL数据库并发量

2022-05-12 23:38:19

SQL数据库字符串

2022-04-02 10:23:12

MySQL数据库

2022-03-04 16:06:33

数据库HarmonyOS鸿蒙

2022-04-28 08:05:05

2022-04-01 10:08:21

SQL 优化MySQL数据库

2022-04-12 10:36:52

数据库PostgreSQLMongoDB

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-03-04 14:57:50

缓存数据库代码

同话题下的热门内容

DAYU200最新烧录OpenHarmony系统教程基于搭载OpenHarmony避障小车连接华为云心得体会OpenHarmony3.2的编译烧录OpenHarmony - ArkUI(ETS) 自定义图片查看组件OpenHarmony3.1-WIFI子系统之STA模式源码解析OpenHarmony之 eTS DataAbility 的使用及数据管理OpenHarmony之 网络管理 Socket 模块的使用HarmonyOs - ArkUI(JS)画布组件Canvas之自定义柱状图

编辑推荐

HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》鸿蒙HarmonyOS分布式软总线:构建低时延、高带宽的多设备虚拟网络华为HarmonyOS的强势突围: 直面物联网迷宫的蓄力进击鸿蒙HarmonyOS2.0发布会现场回忆录
我收藏的内容
点赞
收藏

51CTO技术栈公众号