最近,在学习鸿蒙系统的时候,学到DataAbility的时候一直卡住,原因是文档写的不是太清楚,通过查询不同的资料,终于能利用DataAbility访问数据库了
本项目目标是在表盘上点击按钮就能访问DataAbility的查询方法查询数据库的内容
要想访问数据库,我们得先有一个数据库
如果使用注解处理器的模块为“com.huawei.ohos.hap”模块,则需要在模块的“build.gradle”文件的“ohos”节点中添加以下配置:
compileOptions{
annotationEnabled true }
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 方法。
打开后可以看到它是继承了Ability的,并且有默认的增删改查方法,对于数据库的增删改查我们只需要在这些方法里面实现即可
{
"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为数据库操纵接口;
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");
}
首先在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