HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子

HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子 上一节演示了如何通过DataAbilityHelper类来访问当前应用的文件数据。本节将演示如何通过DataAbilityHelper类来访问当前应用的数据库数据。采用Car设备类型,创建一个名为DataAbilityHelperAccessDatabase的应用。

下面介绍DataAbilityHelper具体的使用步骤。

5.11.1 创建DataAbility

在DevEco Studio中,创建了一个名为UserDataAbility的Data,如下图所示。

创建DataAbility

图5-24 创建DataAbility

UserDataAbility初始化时代码如下:

package com.waylau.hmos.dataabilityhelperaccessdatabase;

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.data.resultset.ResultSet;
import ohos.data.rdb.ValuesBucket;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.utils.net.Uri;
import ohos.utils.PacMap;

import java.io.FileDescriptor;

public class UserDataAbility extends Ability {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001100, "Demo");

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        HiLog.info(LABEL_LOG, "UserDataAbility onStart");
    }

    @Override
    public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
        return null;
    }

    @Override
    public int insert(Uri uri, ValuesBucket value) {
        HiLog.info(LABEL_LOG, "UserDataAbility insert");
        return 999;
    }

    @Override
    public int delete(Uri uri, DataAbilityPredicates predicates) {
        return 0;
    }

    @Override
    public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
        return 0;
    }

    @Override
    public FileDescriptor openFile(Uri uri, String mode) {
        return null;
    }

    @Override
    public String[] getFileTypes(Uri uri, String mimeTypeFilter) {
        return new String[0];
    }

    @Override
    public PacMap call(String method, String arg, PacMap extras) {
        return null;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }
}

5.11.2 初始化数据库

HarmonyOS关系型数据库对外提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的所有数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    HiLog.info(LABEL_LOG, "UserDataAbility onStart");

    // 创建数据库连接,并获取连接对象
    DatabaseHelper helper = new DatabaseHelper(this);
    StoreConfig config = StoreConfig.newDefaultConfig(DATABASE_NAME);
    RdbOpenCallback callback = new RdbOpenCallback() {
        // 初始化数据库
        public void onCreate(RdbStore store) {
            store.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
                "(user_id INTEGER PRIMARY KEY, user_name TEXT NOT NULL, user_age INTEGER)");
        }

        @Override
        public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {}
    };

    store = helper.getRdbStore(config, 1, callback, null);
}

5.11.3 重写query方法

@Override
public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
    if (store == null) {
        HiLog.error(LABEL_LOG, "failed to query, ormContext is null");
        return null;
    }

    // 查询数据库
    RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLE_NAME);
    ResultSet resultSet = store.query(rdbPredicates, columns);

    if (resultSet == null) {
        HiLog.info(LABEL_LOG, "resultSet is null");
    }

    // 返回结果
    return resultSet;
}

5.11.4 重写insert方法

@Override
public int insert(Uri uri, ValuesBucket value) {
    HiLog.info(LABEL_LOG, "UserDataAbility insert");

    // 参数校验
    if (store == null) {
        HiLog.error(LABEL_LOG, "failed to insert, ormContext is null");
        return -1;
    }

    // 插入数据库
    long userId = store.insert(TABLE_NAME, value);

    return Integer.valueOf(userId + "");
}

5.11.5 重写update方法

@Override
public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
    if (store == null) {
        HiLog.error(LABEL_LOG, "failed to update, ormContext is null");
        return -1;
    }

    RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLE_NAME);
    int index = store.update(value, rdbPredicates);

    return index;
}

5.11.6 重写delete方法

@Override
public int delete(Uri uri, DataAbilityPredicates predicates) {
    if (store == null) {
        HiLog.error(LABEL_LOG, "failed to delete, ormContext is null");
        return -1;
    }

    RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLE_NAME);
    int value = store.delete(rdbPredicates);

    return value;
}

5.11.7 修改MainAbilitySlice

修改MainAbilitySlice的onStart方法,代码如下:

package com.waylau.hmos.dataabilityhelperaccessdatabase.slice;

import com.waylau.hmos.dataabilityhelperaccessdatabase.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.ability.DataAbilityHelper;
import ohos.aafwk.ability.DataAbilityRemoteException;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.data.rdb.ValuesBucket;
import ohos.data.resultset.ResultSet;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.utils.net.Uri;

public class MainAbilitySlice extends AbilitySlice {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0x00001, "MainAbilitySlice");

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        // 添加点击事件来触发访问数据
        Text text = (Text) findComponentById(ResourceTable.Id_text_helloworld);
        text.setClickedListener(listener -> this.doDatabaseAction());
    }

    private void doDatabaseAction() {
        DataAbilityHelper helper = DataAbilityHelper.creator(this);

        // 访问数据用的URI,注意用三个斜杠
        Uri uri = Uri.parse("dataability:///com.waylau.hmos.dataabilityhelperaccessdatabase.UserDataAbility");
        String[] columns = {"user_id", "user_name", "user_age"};

        // 查询
        doQuery(helper, uri, columns);

        // 插入
        doInsert(helper, uri, columns);

        // 查询
        doQuery(helper, uri, columns);

        // 更新
        doUpdate(helper, uri, columns);

        // 查询
        doQuery(helper, uri, columns);

        // 删除
        doDelete(helper, uri, columns);

        // 查询
        doQuery(helper, uri, columns);
    }

    private void doQuery(DataAbilityHelper helper, Uri uri, String[] columns) {
        // 构造查询条件
        DataAbilityPredicates predicates = new DataAbilityPredicates();
        predicates.between("user_id", 101, 200);

        // 进行查询
        ResultSet resultSet = null;
        try {
            resultSet = helper.query(uri, columns, predicates);
        } catch (DataAbilityRemoteException e) {
            e.printStackTrace();
        }

        if (resultSet != null && resultSet.getRowCount() > 0) {
            // 在此处理ResultSet中的记录
            while (resultSet.goToNextRow()) {
                // 处理结果
                HiLog.info(LABEL_LOG, "resultSet user_id:%{public}s, user_name:%{public}s, user_age:%{public}s",
                    resultSet.getInt(0), resultSet.getString(1), resultSet.getInt(2));
            }
        } else {
            HiLog.info(LABEL_LOG, "resultSet is null or row count is 0");
        }
    }

    private void doInsert(DataAbilityHelper helper, Uri uri, String[] columns) {
        // 构造查询条件
        DataAbilityPredicates predicates = new DataAbilityPredicates();
        predicates.between("user_Id", 101, 103);

        // 构造插入数据
        ValuesBucket valuesBucket = new ValuesBucket();
        valuesBucket.putInteger(columns[0], 101);
        valuesBucket.putString(columns[1], "Way Lau");
        valuesBucket.putInteger(columns[2], 33);

        try {
            int result = helper.insert(uri, valuesBucket);
            HiLog.info(LABEL_LOG, "insert result:%{public}s", result);
        } catch (DataAbilityRemoteException e) {
            e.printStackTrace();
        }
    }

    private void doUpdate(DataAbilityHelper helper, Uri uri, String[] columns) {
        // 构造查询条件
        DataAbilityPredicates predicates = new DataAbilityPredicates();
        predicates.equalTo("user_id", 101);

        // 构造更新数据
        ValuesBucket valuesBucket = new ValuesBucket();
        valuesBucket.putInteger(columns[0], 101);
        valuesBucket.putString(columns[1], "Way Lau");
        valuesBucket.putInteger(columns[2], 35);

        try {
            int result = helper.update(uri, valuesBucket, predicates);

            HiLog.info(LABEL_LOG, "update result:%{public}s", result);
        } catch (DataAbilityRemoteException e) {
            e.printStackTrace();
        }
    }

    private void doDelete(DataAbilityHelper helper, Uri uri, String[] columns) {
        // 构造查询条件
        DataAbilityPredicates predicates = new DataAbilityPredicates();
        predicates.equalTo("user_id", 101);

        try {
            int result = helper.delete(uri, predicates);

            HiLog.info(LABEL_LOG, "delete result:%{public}s", result);
        } catch (DataAbilityRemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

在上述方法中,在Text添加点击事件来触发访问数据库的操作。

doDatabaseAction方法用于执行数据库操作。借助DataAbilityHelper类的方法,来访问当前UserDataAbility提供的数据库数据。分别执行了查询、插入、查询、更新、查询、删除和查询动作。

注意,上述代码中访问的uri与UserDataAbility在配置数据库中的添加的uri基本是一致的,唯一的区别是上述代码中访问的uri用三个斜杠。

5.11.8 运行

运行应用后,效果如下图所示。

运行应用效果

点击“Hello World”触发了访问数据库的操作,可以看到控制台HiLog输出内容如下:

01-02 23:29:45.275 22633-22703/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/UserDataAbility: UserDataAbility onStart
01-02 23:30:38.333 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: resultSet is null or row count is 0
01-02 23:30:38.334 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/UserDataAbility: UserDataAbility insert
01-02 23:30:38.338 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: insert result:101
01-02 23:30:38.348 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: resultSet user_id:101, user_name:Way Lau, user_age:33
01-02 23:30:38.353 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: update result:1
01-02 23:30:38.357 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: resultSet user_id:101, user_name:Way Lau, user_age:35
01-02 23:30:38.361 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: delete result:1
01-02 23:30:38.364 22633-22633/com.waylau.hmos.dataabilityhelperaccessdatabase I 00001/MainAbilitySlice: resultSet is null or row count is 0

从上述运行日志,可以验证程序的运行。

  • 首先执行查询,数据库的数据是空的
  • 接着插入一条用户数据,该数据的user_id是101
  • 再次查询,返回了user_id是101的用户数据,user_name是Way Lau,user_age是33
  • 执行了更新操作
  • 再次查询,可以看到user_id是101的用户数据,user_age被改为了35
  • 执行了删除操作
  • 再次执行查询,数据库的数据是空的

更多关于HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,DataAbilityHelper用于访问和管理数据库。以下是一个简单的例子,展示如何使用DataAbilityHelper查询数据库中的数据:

// 创建DataAbilityHelper实例
DataAbilityHelper helper = DataAbilityHelper.creator(context);

// 定义查询的URI
Uri uri = Uri.parse("dataability://com.example.myapp.DataAbility/user");

// 执行查询
ResultSet resultSet = helper.query(uri, null, null, null, null);

// 处理查询结果
if (resultSet != null) {
    while (resultSet.goToNextRow()) {
        int id = resultSet.getInt(resultSet.getColumnIndex("id"));
        String name = resultSet.getString(resultSet.getColumnIndex("name"));
        Log.info("User", "ID: " + id + ", Name: " + name);
    }
    resultSet.close();
}

此代码通过DataAbilityHelper查询指定URI的数据,并遍历结果集输出用户信息。

回到顶部