最近,在学习鸿蒙系统的时候,学到DataAbility的时候一直卡住,原因是文档写的不是太清楚,通过查询不同的资料,终于能利用DataAbility访问数据库
本项目目标是在表盘上点击按钮就能访问DataAbility的查询方法查询数据库的内容

数据库创建

要想访问数据库,我们得先有一个数据库

配置“build.gradle”文件

如果使用注解处理器的模块为“com.huawei.ohos.hap”模块,则需要在模块的“build.gradle”文件的“ohos”节点中添加以下配置:

    compileOptions{            annotationEnabled true    }

在这里插入图片描述

新建一个文件夹db用于存放数据库相关java

在这里插入图片描述

新建数据库类BookStore

package com.example.wear2.db;

import ohos.data.orm.OrmDatabase;
import ohos.data.orm.annotation.Database;

@Database(entities = {User.class}, version = 1)
public abstract class BookStore extends OrmDatabase {
}

数据库中有一张User表
新建user

package com.example.wear2.db;

import ohos.data.orm.OrmObject;
import ohos.data.orm.annotation.Entity;
import ohos.data.orm.annotation.Index;
import ohos.data.orm.annotation.PrimaryKey;

@Entity(tableName = "user", ignoredColumns = {"ignoreColumn1", "ignoreColumn2"},
        indices = {@Index(value = {"firstName", "lastName"}, name = "name_index", unique = true)})
public class User extends OrmObject {
    // 此处将userId设为了自增的主键。注意只有在数据类型为包装类型时,自增主键才能生效。
    @PrimaryKey(autoGenerate = true)
    private Integer userId;
    private String firstName;
    private String lastName;
    private int age;
    private double balance;
    private int ignoreColumn1;
    private int ignoreColumn2;
    // 开发者自行添加字段的getter和setter 方法。

新建DataAbility

新建Empty Data Ability

在这里插入图片描述

弹窗输入Data Ability的名称,并勾选Visible

在这里插入图片描述

确定后,可以看到新建的UserDataAbility

在这里插入图片描述
打开后可以看到它是继承了Ability的,并且有默认的增删改查方法,对于数据库的增删改查我们只需要在这些方法里面实现即可
在这里插入图片描述

在这里插入图片描述

配置config.json

{
        "visible": true,
        "permissions": [
          "com.example.wear2.UserDataAbility.DATA"
        ],
        "name": "com.example.wear2.UserDataAbility",
        "icon": "$media:icon",
        "description": "$string:userdataability_description",
        "type": "data",
        "uri": "dataability://com.example.wear2.UserDataAbility"
      }

在config.json我们可以看到UserDataAbility的相应配置,其中type为data说明这个Ability为DataAbility;permissions为该DataAbility的访问权限,如果别的Ability要访问就需要配置"reqPermissions": [ { "name": "com.example.wear2.UserDataAbility.DATA" }];而uri为访问该DataAbility的uri地址

添加全局变量

接下来改造 UserDataAbility,首先我们需要添加全局变量

	private static final String DATABASE_NAME ="BookStore.db";
    private static final String DATABASE_NAME_ALIAS = "BookStore";
    private static OrmContext context = null;

其中DATABASE_NAME为数据库文件名;DATABASE_NAME_ALIAS 为创建一个别名;context为数据库操纵接口;

改造onStart方法

UserDataAbility的onStart方法会在项目启动后运行一次,所有我们将数据库创建以及插入一条数据的代码写在这里,这样项目启动后调用onStart方法创建数据库并插入一条数据

@Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        DatabaseHelper helper = new DatabaseHelper(this); // context入参类型为ohos.app.Context,注意不要使用slice.getContext()来获取context,请直接传入slice,否则会出现找不到类的报错。
        context = helper.getOrmContext(DATABASE_NAME_ALIAS, DATABASE_NAME, BookStore.class);
        User user = new User();
        user.setFirstName("Zhang");
        user.setLastName("San");
        user.setAge(29);
        user.setBalance(100.51);
        boolean isSuccessed = context.insert(user);
        isSuccessed = context.flush();
        HiLog.info(LABEL_LOG, "ProviderAbility onStart");
    }

改造MainAbilitySlice

添加配置

首先在config.json中的MainAbility中添加访问权限

 "reqPermissions": [
          {
            "name": "com.example.wear2.UserDataAbility.DATA"
          }]

添加全局变量

在MainAbilitySlice中添加一个日志打印变量,用于打印我们访问到的数据

private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "MainAbilitySlice");

新建访问方法

在MainAbilitySlice新建一个访问UserDataAbility的方法queryDataAbility()

public void queryDataAbility() throws DataAbilityRemoteException {

// 构造查询条件
        DataAbilityPredicates predicates = new DataAbilityPredicates();
        predicates.equalTo("lastName", "San");
// 进行查询
        String[] columns = new String[] {"firstName"};
        Uri uri = Uri.parse("dataability:///com.example.wear2.UserDataAbility");
        DataAbilityHelper helper = DataAbilityHelper.creator(this);
        ResultSet resultSet = helper.query(uri,columns,predicates);
// 处理结果
        HiLog.info(LABEL_LOG, "queryDataAbilitystart");
        resultSet.goToFirstRow();
        do{
            // 在此处理ResultSet中的记录;
            HiLog.info(LABEL_LOG, "firstName="+resultSet.getString(0));
        }while(resultSet.goToNextRow());
    }

其中uri 为UserDataAbility配置的uri,但是区别是dataability:后为三个斜杠而不是两个,这个要注意下

按钮添加方法调用

UserDataAbility的onStart的按钮监听中,添加调用queryDataAbility方法,这样,当点击按钮后,就会在后台答应查询到的数据库的内容

@Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_main_layout); // 加载XML布局
        Button button = (Button) findComponentById(ResourceTable.Id_button);

        if (button != null) {
            // 为按钮设置点击回调
            button.setClickedListener(new Component.ClickedListener() {
                @Override
                public void onClick(Component component) {
                    //createStore();
                    try {
                        queryDataAbility();
                    } catch (DataAbilityRemoteException e) {
                        e.printStackTrace();
                    }
    }

点击按钮后,后台打印查询接口
在这里插入图片描述

在这里插入图片描述

更多技术交流请加入QQ群
群名称:华为鸿蒙harmonyos开发
群 号:1164091073

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐