HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子
HarmonyOS鸿蒙Next之Ability06——DataAbilityHelper访问数据库的例子 上一节演示了如何通过DataAbilityHelper类来访问当前应用的文件数据。本节将演示如何通过DataAbilityHelper类来访问当前应用的数据库数据。采用Car设备类型,创建一个名为DataAbilityHelperAccessDatabase的应用。
下面介绍DataAbilityHelper具体的使用步骤。
5.11.1 创建DataAbility
在DevEco Studio中,创建了一个名为UserDataAbility的Data,如下图所示。
图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
更多关于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的数据,并遍历结果集输出用户信息。