# DataAbilityRDBDemo **Repository Path**: cxshu/data-ability-rdbdemo ## Basic Information - **Project Name**: DataAbilityRDBDemo - **Description**: 本示例通过DataAbility对关系型数据库(RDB)进行增加、删除、更新、查询 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-10 - **Last Updated**: 2021-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: HarmonyOS, dataability ## README # 一、概述 使用Data模板的Ability(以下简称“Data”)有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。 数据的存放形式多样,可以是数据库,也可以是磁盘上的文件。 Data对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供。 本篇文章详细讲述了通过DataAbility来对关系型数据库进行操作。 ![image](screenshots/phone/Snipaste_2021-09-11_14-31-01.png) # 二、开发步骤: ## 1. 创建DataAbility 1. 新建一个Empty DataAbility,创建完成后,会在config.json里生成如下配置 ```json { "permissions": [ "com.cxs.rdbdemo.DataAbilityShellProvider.PROVIDER" ], "name": "com.cxs.rdbdemo.DataAbility", "icon": "$media:icon", "description": "$string:dataability_description", "type": "data", "uri": "dataability://com.cxs.rdbdemo.DataAbility" } ``` 2. 申请访问该DataAbility时需要的权限 ```json "reqPermissions": [ { "name": "com.cxs.rdbdemo.DataAbilityShellProvider.PROVIDER" } ] ``` ## 2. DataAbiliy操作数据库 1. __创建数据库__ 在DataAbility的onStart()方法中创建关系型数据库,在数据库中新增两个表(user和book) ```java public class DataAbility extends Ability { private RdbStore rdbStore; RdbOpenCallback callback = new RdbOpenCallback() { @Override public void onCreate(RdbStore rdbStore) { // 创建数据库时被回调,可以在该方法中初始化表结构,并添加一些应用使用到的初始化数据 rdbStore.executeSql("CREATE TABLE IF NOT EXISTS user" + "(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL)"); rdbStore.executeSql("CREATE TABLE IF NOT EXISTS book" + "(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, price REAL)"); } @Override public void onUpgrade(RdbStore rdbStore, int i, int i1) {} }; @Override public void onStart(Intent intent) { super.onStart(intent); DatabaseHelper helper = new DatabaseHelper(this); StoreConfig config = StoreConfig.newDefaultConfig("rdbstoretest.db"); rdbStore = helper.getRdbStore(config, 1, callback); } } ``` 2. __插入数据__ 重写 DataAbility 中的插入方法 ```java @Override public int insert(Uri uri, ValuesBucket value) { if (rdbStore == null) { return -1; } long index = rdbStore.insert(uri.getLastPath(), value); return (int)index; } ``` 3. __查询数据__ 重写 DataAbility 中的查询方法 ```java @Override public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) { // 把DataAbilityPredicates转换为RdbPredicates RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, uri.getLastPath()); ResultSet query = rdbStore.query(rdbPredicates, columns); return query; } ``` 4. __更新数据__ ```java @Override public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) { RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, uri.getLastPath()); int update = rdbStore.update(value, rdbPredicates); return update; } ``` 5. __删除数据__ ```java @Override public int delete(Uri uri, DataAbilityPredicates predicates) { RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, uri.getLastPath()); int delete = rdbStore.delete(rdbPredicates); return delete; } ``` ## 3. 访问DataAbility 开发者可以通过DataAbilityHelper类来访问当前应用或其他应用提供的共享数据。 ```java private static final String BASE_URI = "dataability:///com.cxs.rdbdemo.DataAbility/"; private static final String TABLE_USER = "user"; private static final String TABLE_BOOK = "book"; Uri userUri, bookUri; DataAbilityHelper helper; @Override public void onStart(Intent intent) { ... helper = DataAbilityHelper.creator(this); userUri = Uri.parse(BASE_URI + TABLE_USER); bookUri = Uri.parse(BASE_URI + TABLE_BOOK); } ``` 1. 查询数据 ```java DataAbilityPredicates predicates = new DataAbilityPredicates(); try { ResultSet query = helper.query(userUri, new String[]{"name", "age", "salary"}, predicates); while (query.goToNextRow()) { System.out.println(query.getString(query.getColumnIndexForName("name"))); System.out.println(query.getInt(query.getColumnIndexForName("age"))); System.out.println(query.getDouble(query.getColumnIndexForName("salary"))); } } catch (DataAbilityRemoteException e) { e.printStackTrace(); } ``` 2. 插入数据 ```java ValuesBucket valuesBucket = new ValuesBucket(); valuesBucket.putString("name", "zhangsan"); valuesBucket.putInteger("age", 20); valuesBucket.putDouble("salary", 567.34); try { helper.insert(userUri, valuesBucket); } catch (DataAbilityRemoteException e) { e.printStackTrace(); } ``` 3. 更新数据 ```java ValuesBucket valuesBucket = new ValuesBucket(); valuesBucket.putString("name", "张三"); DataAbilityPredicates predicates = new DataAbilityPredicates().equalTo("name", "zhangsan"); try { int update = helper.update(userUri, valuesBucket, predicates); } catch (DataAbilityRemoteException e) { e.printStackTrace(); } ``` 4. 删除数据 ```java DataAbilityPredicates predicates = new DataAbilityPredicates() .greaterThan("age", 18); try { helper.delete(userUri, predicates); } catch (DataAbilityRemoteException e) { e.printStackTrace(); } ```