[文章]HarmonyOS应用开发数据交互--关系型数据库完整流程练习

阅读量0
0
2
1.创建一个空的java项目


2.创建data Ability
如下步骤所示,创建完成后会生成相应的文件,同时会帮您修改好配置文件。


配置文件(这部分自动生成,与你的目录结果、建议不要修改):
  1. {
  2.   "permissions": [
  3.     "com.example.rdb.DataAbilityShellProvider.PROVIDER"
  4.   ],
  5.   "name": "com.example.rdb.Database.fristRDB",
  6.   "icon": "$media:icon",
  7.   "description": "$string:fristrdb_description",
  8.   "type": "data",
  9.   "visible": false,
  10.   "uri": "dataability://com.example.rdb.Database.fristRDB"
  11. }
复制代码

3.编写创建数据库代码
编写的fristRDB.java文件:
  1. package com.example.rdb.Database;

  2. import ohos.aafwk.ability.Ability;
  3. import ohos.aafwk.ability.DataAbilityHelper;
  4. import ohos.aafwk.content.Intent;
  5. import ohos.data.DatabaseHelper;
  6. import ohos.data.dataability.DataAbilityUtils;
  7. import ohos.data.rdb.*;
  8. import ohos.data.resultset.ResultSet;
  9. import ohos.data.dataability.DataAbilityPredicates;

  10. import ohos.hiviewdfx.HiLog;
  11. import ohos.hiviewdfx.HiLogLabel;
  12. import ohos.utils.net.Uri;
  13. import ohos.utils.PacMap;

  14. import java.io.FileDescriptor;

  15. public class fristRDB extends Ability {
  16.     //    数据库参数
  17.     private static final String DB_NAME = "persondataability.db";       //数据库名称
  18.     private static final String DB_TAB_NAME = "person";                 //表名称
  19.     private static final String DB_COLUMN_PERSON_ID = "id";             //列 id
  20.     private static final String DB_COLUMN_NAME = "name";                //列 name
  21.     private static final String DB_COLUMN_GENDER = "gender";            //列 gender
  22.     private static final String DB_COLUMN_AGE = "age";                  //列 age
  23.     private static final int DB_VERSION = 1;                            //版本

  24.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");


  25.     private StoreConfig config = StoreConfig.newDefaultConfig(DB_NAME);  //通过指定数据库名称使用默认配置创建数据库配置。
  26.     private RdbStore rdbStore;  //提供管理关系数据库 (RDB) 的方法。
  27.     //   RdbOpenCallback 管理数据库创建、升级和降级。
  28.     private RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() {
  29.         @Override
  30.         public void onCreate(RdbStore store) {  // 数据库创建时被回调,开发者可以在该方法中初始化表结构,并添加一些应用使用到的初始化数据。
  31.             store.executeSql("create table if not exists "
  32.                     + DB_TAB_NAME + " ("
  33.                     + DB_COLUMN_PERSON_ID + " integer primary key, "
  34.                     + DB_COLUMN_NAME + " text not null, "
  35.                     + DB_COLUMN_GENDER + " text not null, "
  36.                     + DB_COLUMN_AGE + " integer)");
  37.         }

  38.         @Override
  39.         public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {
  40.         }
  41.     };

  42.     @Override
  43.     public void onStart(Intent intent) {
  44.         super.onStart(intent);
  45.         HiLog.info(LABEL_LOG, "fristRDB onStart");
  46.         DatabaseHelper databaseHelper = new DatabaseHelper(this);
  47.         //   根据配置创建或打开数据库。
  48.         rdbStore = databaseHelper.getRdbStore(config, DB_VERSION, rdbOpenCallback, null);
  49.     }

  50.     /**
  51.      * 数据查询
  52.      * @param uri
  53.      * @param columns
  54.      * @param predicates
  55.      * @return
  56.      */
  57.     @Override
  58.     public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
  59.         //   拼装查询语句
  60.         RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
  61.         //   查询表中数据 根据 查询语句 + 查找的列
  62.         ResultSet resultSet = rdbStore.query(rdbPredicates, columns);
  63.         if (resultSet == null) {
  64.             HiLog.info(LABEL_LOG, "resultSet is null");
  65.         }
  66.         return resultSet;
  67.     }

  68.     /**
  69.      * 数据添加
  70.      * @param uri  插入的目标路径
  71.      * @param value  插入的数据值
  72.      * @return
  73.      */
  74.     @Override
  75.     public int insert(Uri uri, ValuesBucket value) {
  76.         HiLog.info(LABEL_LOG, "fristRDB insert");

  77.         String path = uri.getLastPath();
  78.         // 判断数据添加的表名称
  79.         if (!"person".equals(path)) {
  80.             HiLog.info(LABEL_LOG, "DataAbility insert path is not matched");
  81.             return -1;
  82.         }
  83.         //用于整理存储添加的数据
  84.         ValuesBucket values = new ValuesBucket();
  85.         values.putInteger(DB_COLUMN_PERSON_ID, value.getInteger(DB_COLUMN_PERSON_ID));
  86.         values.putString(DB_COLUMN_NAME, value.getString(DB_COLUMN_NAME));
  87.         values.putString(DB_COLUMN_GENDER, value.getString(DB_COLUMN_GENDER));
  88.         values.putInteger(DB_COLUMN_AGE, value.getInteger(DB_COLUMN_AGE));
  89.         int index = (int) rdbStore.insert(DB_TAB_NAME, values);
  90.         //  当表格数据插入成功时,可执行DataAbilityHelper.creator(this, uri).notifyChange(uri),通知该表格数据的订阅者
  91.         DataAbilityHelper.creator(this, uri).notifyChange(uri);
  92.         return index;
  93.     }

  94.     /**
  95.      *  数据删除
  96.      * @param uri  删除的目标路径
  97.      * @param predicates  删除条件
  98.      * @return
  99.      */
  100.     @Override
  101.     public int delete(Uri uri, DataAbilityPredicates predicates) {
  102.         //   解析出要删除的数据
  103.         RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
  104.         int index = rdbStore.delete(rdbPredicates);
  105.         HiLog.info(LABEL_LOG, "delete: " + index);
  106.         //   通知观察者数据已经修改
  107.         DataAbilityHelper.creator(this, uri).notifyChange(uri);
  108.         return index;
  109.     }

  110.     /**
  111.      * 数据修改
  112.      * @param uri
  113.      * @param value
  114.      * @param predicates
  115.      * @return
  116.      */
  117.     @Override
  118.     public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
  119.         //   解析出要修改的数据
  120.         RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
  121.         int index = rdbStore.update(value, rdbPredicates);
  122.         HiLog.info(LABEL_LOG, "update: " + index);
  123.         //   通知观察者数据已经修改
  124.         DataAbilityHelper.creator(this, uri).notifyChange(uri);
  125.         return index;
  126.     }

  127.     @Override
  128.     public FileDescriptor openFile(Uri uri, String mode) {
  129.         return null;
  130.     }

  131.     @Override
  132.     public String[] getFileTypes(Uri uri, String mimeTypeFilter) {
  133.         return new String[0];
  134.     }

  135.     @Override
  136.     public PacMap call(String method, String arg, PacMap extras) {
  137.         return null;
  138.     }

  139.     @Override
  140.     public String getType(Uri uri) {
  141.         return null;
  142.     }

  143.     public void myInsert(){
  144.         ValuesBucket values = new ValuesBucket();
  145.         values.putInteger("id", 1);
  146.         values.putString("name", "zhangsan");
  147.         values.putInteger("age", 18);
  148.         long id = rdbStore.insert("person", values);
  149.     }
  150. }
复制代码

4.编写数据操作代码
为了方便在在MainAbility上编写数据库操作代码。
  1. package com.example.rdb.slice;

  2. import com.example.rdb.Database.MyDataAbilityHelper;
  3. import com.example.rdb.ResourceTable;
  4. import ohos.aafwk.ability.AbilitySlice;
  5. import ohos.aafwk.ability.DataAbilityHelper;
  6. import ohos.aafwk.ability.DataAbilityRemoteException;
  7. import ohos.aafwk.content.Intent;
  8. import ohos.app.Context;
  9. import ohos.data.dataability.DataAbilityPredicates;
  10. import ohos.data.rdb.RdbStore;
  11. import ohos.data.rdb.ValuesBucket;
  12. import ohos.data.resultset.ResultSet;
  13. import ohos.hiviewdfx.HiLog;
  14. import ohos.hiviewdfx.HiLogLabel;
  15. import ohos.utils.net.Uri;

  16. public class MainAbilitySlice extends AbilitySlice {

  17.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");

  18.     private static final String BASE_URI = "dataability:///com.example.rdb.Database.fristRDB";
  19.     private static final String DATA_PATH = "/person";
  20.     private static final String DB_COLUMN_PERSON_ID = "id";
  21.     private static final String DB_COLUMN_NAME = "name";
  22.     private static final String DB_COLUMN_GENDER = "gender";
  23.     private static final String DB_COLUMN_AGE = "age";
  24.     private DataAbilityHelper databaseHelper = DataAbilityHelper.creator((Context) this);

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

  29.         databaseHelper = DataAbilityHelper.creator(this);

  30.         insert(33, "Tom", "man", 20);
  31.         query();
  32.         delete(33);
  33.     }

  34.     @Override
  35.     public void onActive() {
  36.         super.onActive();
  37.     }

  38.     @Override
  39.     public void onForeground(Intent intent) {
  40.         super.onForeground(intent);
  41.     }

  42.     public void query() {
  43.         String[] columns = new String[] {DB_COLUMN_PERSON_ID,
  44.                 DB_COLUMN_NAME, DB_COLUMN_GENDER, DB_COLUMN_AGE};
  45.         // 构造查询条件
  46.         DataAbilityPredicates predicates = new DataAbilityPredicates();
  47.         predicates.between(DB_COLUMN_AGE, 15, 40);
  48.         try {
  49.             ResultSet resultSet = databaseHelper.query(Uri.parse(BASE_URI + DATA_PATH),
  50.                     columns, predicates);
  51.             if (resultSet == null || resultSet.getRowCount() == 0) {
  52.                 HiLog.info(LABEL_LOG, "query: resultSet is null or no result found");
  53.                 return;
  54.             }
  55.             //移动到第一行
  56.             resultSet.goToFirstRow();
  57.             do {
  58.                 int id = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_PERSON_ID));
  59.                 String name = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_NAME));
  60.                 String gender = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_GENDER));
  61.                 int age = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_AGE));
  62.                 HiLog.info(LABEL_LOG, "query: Id :" + id + " Name :" + name + " Gender :" + gender + " Age :" + age);
  63.             } while (resultSet.goToNextRow());//移动到下一行一行
  64.         } catch (DataAbilityRemoteException | IllegalStateException exception) {
  65.             HiLog.error(LABEL_LOG, "query: dataRemote exception | illegalStateException");
  66.         }
  67.     }

  68.     public void insert(int id, String name, String gender, int age) {
  69.         ValuesBucket valuesBucket = new ValuesBucket();
  70.         valuesBucket.putInteger(DB_COLUMN_PERSON_ID, id);
  71.         valuesBucket.putString(DB_COLUMN_NAME, name);
  72.         valuesBucket.putString(DB_COLUMN_GENDER, gender);
  73.         valuesBucket.putInteger(DB_COLUMN_AGE, age);
  74.         HiLog.info(LABEL_LOG, "valuesBucket:"+valuesBucket);
  75.         try {
  76.             if (databaseHelper.insert(Uri.parse(BASE_URI + DATA_PATH), valuesBucket) != -1) {
  77.                 HiLog.info(LABEL_LOG, "insert successful");
  78.             }
  79.         } catch (DataAbilityRemoteException | IllegalStateException exception) {
  80.             HiLog.error(LABEL_LOG, "insert: dataRemote exception|illegalStateException");
  81.         }
  82.     }

  83.     public void update() {
  84.         DataAbilityPredicates predicates = new DataAbilityPredicates();
  85.         predicates.equalTo(DB_COLUMN_PERSON_ID, 102);
  86.         ValuesBucket valuesBucket = new ValuesBucket();
  87.         valuesBucket.putString(DB_COLUMN_NAME, "ZhangSanPlus");
  88.         valuesBucket.putInteger(DB_COLUMN_AGE, 28);
  89.         try {
  90.             if (databaseHelper.update(Uri.parse(BASE_URI + DATA_PATH), valuesBucket, predicates) != -1) {
  91.                 HiLog.info(LABEL_LOG, "update successful");
  92.             }
  93.         } catch (DataAbilityRemoteException | IllegalStateException exception) {
  94.             HiLog.error(LABEL_LOG, "update: dataRemote exception | illegalStateException");
  95.         }
  96.     }

  97.     public void delete(int id) {
  98.         DataAbilityPredicates predicates = new DataAbilityPredicates()
  99.                 .equalTo(DB_COLUMN_PERSON_ID, id);
  100.         try {
  101.             if (databaseHelper.delete(Uri.parse(BASE_URI + DATA_PATH), predicates) != -1) {
  102.                 HiLog.info(LABEL_LOG, "delete successful");
  103.             }
  104.         } catch (DataAbilityRemoteException | IllegalStateException exception) {
  105.             HiLog.error(LABEL_LOG, "delete: dataRemote exception | illegalStateException");
  106.         }
  107.     }
  108. }
复制代码

5.查看结果
在虚拟机上运行后,打开Hilog,搜索查看输出的内容。




完整代码地址:
https://gitee.com/jltfcloudcn/jump_to/tree/master/HarmonyOS%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BB%83%E4%B9%A0/HarmonyOS%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BB%83%E4%B9%A0
附件:

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友