树叶云鸿蒙OS教程:鸿蒙OS 创建Data

使用 Data 模板的 Ability 形式仍然是 Ability,因此,开发者需要为应用添加一个或多个 Ability 的子类,来提供程序与其他应用之间的接口。Data 为结构化数据和文件提供了不同 API 接口供用户使用,因此,开发者需要首先确定好使用何种类型的数据。本章节主要讲述了创建 Data 的基本步骤和需要使用的接口。

确定数据存储方式

确定数据的存储方式,Data 支持以下两种数据形式:

  • 文件数据:如文本、图片、音乐等。
  • 结构化数据:如数据库等。

实现 UserDataAbility

UserDataAbility 接收其他应用发送的请求,提供外部程序访问的入口,从而实现应用间的数据访问。Data 提供了文件存储和数据库存储两组接口供用户使用。

文件存储

开发者需要在 Data 中重写 FileDescriptor openFile (Uri uri, String mode)方法来操作文件:uri 为客户端传入的请求目标路径;mode 为开发者对文件的操作选项,可选方式包含“r”(读), “w”(写), “rw”(读写)等。

MessageParcel 类提供了一个静态方法,用于获取 MessageParcel 实例。通过dupFileDescriptor() 函数复制待操作文件流的文件描述符,并将其返回,供远端应用使用。

示例:根据传入的 uri 打开对应的文件

// 创建 messageParcel
MessageParcel messageParcel = MessageParcel.obtain();
File file = new File(uri.getDecodedPathList().get(1));
if (mode == null || !"rw".equals(mode)) {
    file.setReadOnly();
}
FileInputStream fileIs = new FileInputStream(file);
FileDescriptor fd = fileIs.getFD();

 
// 绑定文件描述符
return messageParcel.dupFileDescriptor(fd);

数据库存储

  1. 初始化数据库连接。

系统会在应用启动时调用 onStart()方法创建 Data 实例。在此方法中,开发者应该创建数据库连接,并获取连接对象,以便后续和数据库进行操作。为了避免影响应用启动速度,开发者应当尽可能将非必要的耗时任务推迟到使用时执行,而不是在此方法中执行所有初始化。

示例:初始化的时候连接数据库

   private static final String DATABASE_NAME ="UserDataAbility.db";
   private static final String DATABASE_NAME_ALIAS = "UserDataAbility";
   private OrmContext ormContext = null;

    
   @Override
   public void onStart(Intent intent) {
       super.onStart(intent);
       DatabaseHelper manager = new DatabaseHelper(this);
       ormContext = manager.getOrmContext(DATABASE_NAME_ALIAS, DATABASE_NAME, BookStore.class);
   }

  1. 编写数据库操作方法。

Ability 定义了 6 个方法供用户处理对数据库表数据的增删改查。这 6 个方法在 Ability 中已默认实现,开发者可按需重写。

方法描述
ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates)查询数据库
int insert(Uri uri, ValuesBucket value)向数据库中插入单条数据
int batchInsert(Uri uri, ValuesBucket[] values)向数据库中插入多条数据
int delete(Uri uri, DataAbilityPredicates predicates)删除一条或多条数据
int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates)更新数据库
DataAbilityResult[] executeBatch(ArrayList<DataAbilityOperation> operations)批量操作数据库

这些方法的使用说明如下:

  • query()

该方法接收三个参数,分别是查询的目标路径,查询的列名,以及查询条件,查询条件由类 DataAbilityPredicates 构建。根据传入的列名和查询条件查询用户表的代码示例如下:

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

      
         // 查询数据库
         OrmPredicates ormPredicates = DataAbilityUtils.createOrmPredicates(predicates,User.class);
         ResultSet resultSet = ormContext.query(ormPredicates, columns);
         if (resultSet == null) {
             HiLog.info(this.getClass(), "resultSet is null");
         }

      
         // 返回结果
         return resultSet;
     }

  • insert()

该方法接收两个参数,分别是插入的目标路径和插入的数据值。其中,插入的数据由 ValuesBucket 封装,服务端可以从该参数中解析出对应的属性,然后插入到数据库中。此方法返回一个 int 类型的值用于标识结果。接收到传过来的用户信息并把它保存到数据库中的代码示例如下:

     public int insert(Uri uri, ValuesBucket value) {
         // 参数校验
         if (ormContext == null) {
             HiLog.error(this.getClass().getSimpleName(), "failed to insert, ormContext is null");
             return -1;
         }
         String path = uri.getPath();

      
         if (buildPathMatcher().getPathId(path) != PathId) {
             HiLog.info(this.getClass(), "UserDataAbility insert path is not matched");
             return -1;
         }

      
         // 构造插入数据
         User user = new User();
         user.setUserId(value.getInteger("userId"));
         user.setFirstName(value.getString("firstName"));
         user.setLastName(value.getString("lastName"));
         user.setAge(value.getInteger("age"));
         user.setBalance(value.getDouble("balance"));

      
         // 插入数据库
         boolean isSuccessed = true;
         try {
             isSuccessed = ormContext.insert(user);
         } catch (DataAbilityRemoteException e) {
             HiLog.error(TAG, "insert fail: " + e.getMessage());            
             throw new RuntimeException(e);        
         }
         if (!isSuccessed) {
             HiLog.error(this.getClass().getSimpleName(), "failed to insert");
             return -1;
         }
         isSuccessed = ormContext.flush();
         if (!isSuccessed) {
             HiLog.error(this.getClass().getSimpleName(), "failed to insert flush");
             return -1;
         }
         DataAbilityHelper.creator(this, uri).notifyChange(uri);
         int id = Math.toIntExact(user.getRowId());
         return id;
     }

  • batchInsert()

该方法为批量插入方法,接收一个 ValuesBucket 数组用于单次插入一组对象。它的作用是提高插入多条重复数据的效率。该方法系统已实现,开发者可以直接调用。

  • delete()

该方法用来执行删除操作。删除条件由类 DataAbilityPredicates 构建,服务端在接收到该参数之后可以从中解析出要删除的数据,然后到数据库中执行。根据传入的条件删除用户表数据的代码示例如下:

     public int delete(Uri uri, DataAbilityPredicates predicates) {
         if (ormContext == null) {
             HiLog.error(this.getClass().getSimpleName(), "failed to delete, ormContext is null");
             return -1;
         }

      
         OrmPredicates ormPredicates = DataAbilityUtils.createOrmPredicates(predicates,User.class);
         int value = ormContext.delete(ormPredicates);
         DataAbilityHelper.creator(this, uri).notifyChange(uri);
         return value;
     }

  • update()

此方法用来执行更新操作。用户可以在 ValuesBucket 参数中指定要更新的数据,在 DataAbilityPredicates 中构建更新的条件等。更新用户表的数据的代码示例如下:

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

      
        OrmPredicates ormPredicates = DataAbilityUtils.createOrmPredicates(predicates,User.class);
        int index = ormContext.update(ormPredicates, value);
        HiLog.info(this.getClass(), "UserDataAbility update value:" + index);
        DataAbilityHelper.creator(this, uri).notifyChange(uri);
        return index;
     }

  • executeBatch()

此方法用来批量执行操作。DataAbilityOperation 中提供了设置操作类型、数据和操作条件的方法,用户可自行设置自己要执行的数据库操作。该方法系统已实现,开发者可以直接调用。

注册UserDataAbility

和 Service 类似,开发者必须在配置配置文件中注册 Data。并且配置以下属性:

  • type: 类型设置为 data
  • uri: 对外提供的访问路径,全局唯一
  • permissions: 访问该 data ability 时需要申请的访问权限
{
    "name": ".UserDataAbility",
     "type": "data",
     "visible": true,
     "uri": "dataability://com.example.myapplication5.DataAbilityTest",
     "permissions": [
        "com.example.myapplication5.DataAbility.DATA"
     ]
}

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/180181.html<

(0)
管理的头像管理
上一篇2025-03-26 21:56
下一篇 2025-03-26 21:58

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注