当前位置:   article > 正文

鸿蒙HarmonyOS分布式数据库使用_鸿蒙分布式数据库

鸿蒙分布式数据库

一、配置文件

config的module的abilities同级

    "reqPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
      },
      {
        "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
      },
      {
        "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
      },
      {
        "name": "ohos.permission.GET_BUNDLE_INFO"
      }
    ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二、Ability中声明使用

MainAbility的onStart方法中声明使用

        requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
  • 1

三、使用的AbilitySlice中声明数据库并使用

因为数据库很多情况下都是跨AbilitySlice使用的所以需要在AbilitySlice中声明 然后在DBUtils工具类中获取

3.1声明数据库

 private SingleKvStore singleKvStore = null;//数据库   kv就是key-value的类型数据库的简写 

//在onStart 方法里声明/获取数据库 创建数据库和获取数据库合二为一的 这个DBUtils工具类见下面==》四、工具类中声明/获取数据库的代码this是创建数据必要的上下文 RecordAccouontsDB是数据库名字 这个随便你自己起
        singleKvStore = DBUtils.initOrGetDB(this,"RecordAccouontsDB");
  • 1
  • 2
  • 3
  • 4

3.2 存储数据

//在需要存数据的地方  因为分布式数据库只有 key和value 所以 value 用的json的字符串 和数据库存储有关代码需要用try catch包起来
  singleKvStore.putString("key"+ id, "{\"id\":"+id+
                                ",\"money\":"+money+
                                ",\"paymentMatters\":\""+paymentMatters+
                                "\",\"dateYear\":"+dateYear+
                                "\",\"inOrExp\":"+inOrExp+"}");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.3 监听数据变化

     //数据库里的数据变化监听
        singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, new KvStoreObserver() {
            @Override
            public void onChange(ChangeNotification changeNotification) {
                //刷新页面上的数据,同样有一个坑,onChange方法实质上,在一个子线程里执行
                getUITaskDispatcher().asyncDispatch(new Runnable() {
                    @Override
                    public void run() {
                        //在这里执行页面ui组件的显示刷新 后面的3.4 3.5都是写在这里的
                    }
                });
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.3 查询数据

//谓词查询
     Query query = Query.select();
        query.equalTo("$.dateYear", DateUtils.getCurrentYear())
                .and().greaterThanOrEqualTo("$.money",5);
        List<Entry> entries = singleKvStore.getEntries(query);
        //复位查询关键词 这样就不用反复声明了
query.reset();
    query.equalTo("$.id","123456");
 entries = singleKvStore.getEntries(query);
    //详见官方分布式数据服务关键API功能介绍
    //https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-mdds-guidelines-0000000000030122
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.4 显示数据

//谓词查询
 double money;
   for (Entry entry : entries) {
   //遍历数据 因为上面我查的id是123456的数据 所以这里就一条实际情况大家根据需要整哈
            zsonObject = ZSONObject.stringToZSON(entry.getValue().getString());
            money+= zsonObject.getDouble("money");
        }
        //给组件赋值数据
       Text moneyText= (Text) findComponentById(ResourceTable.Id_money_text)
  moneyText.setText(money+ "");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

四、工具类中声明/获取数据库

鸿蒙的数据库声明和获取是一套代码 没有就创建 有就获取 在utils文件夹下创建DBUtils工具类

public class DBUtils {
    //具体的实现数据库的初始化
    public static SingleKvStore initOrGetDB(Context context,String storeId){
        //要做的是事情,定义数据库,设计数据库的表里有什么字段,这里就举例子 自己根据自己的项目写
        FieldNode fdid = new FieldNode("id");//字段名
        fdid.setNullable(false);//不能为空
        fdid.setType(FieldValueType.STRING);//数据类型
        
        FieldNode fdmoney = new FieldNode("money");
        fdmoney.setType(FieldValueType.DOUBLE);//数据类型

        FieldNode fdpaymentMatters = new FieldNode("paymentMatters");
        fdpaymentMatters.setType(FieldValueType.STRING);//数据类型

        FieldNode fddateYear = new FieldNode("dateYear");
        fddateYear.setType(FieldValueType.INTEGER);//数据类型

        FieldNode fdinOrExp = new FieldNode("inOrExp");
        fdinOrExp.setType(FieldValueType.BOOLEAN);//数据类型

        //把上面的字段,封装到Schema对象
        Schema schema = new Schema();
        //设置索引
        ArrayList<String> indexList = new ArrayList<>();
        indexList.add("$.id"); //schema默认有一个rootFieldNode
        schema.setIndexes(indexList);
        schema.getRootFieldNode().appendChild(fdid);
        schema.getRootFieldNode().appendChild(fdmoney);
        schema.getRootFieldNode().appendChild(fdpaymentMatters);
        schema.getRootFieldNode().appendChild(fddateYear);
        schema.getRootFieldNode().appendChild(fdinOrExp);
        schema.setSchemaMode(SchemaMode.STRICT);//严格模式

        KvManagerConfig kvManagerConfig = new KvManagerConfig(context);
        KvManager kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
        //设置操作参数
        Options options = new Options();
        options.setCreateIfMissing(true)//是否默认创建
                .setEncrypt(false)//是否默认加密
                .setKvStoreType(KvStoreType.SINGLE_VERSION)//单版本类型
                .setSchema(schema);
        SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId);
        return  singleKvStore;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

分布式数据库参数说明

setKvStoreType 有两种类型 单版本类型SINGLE_VERSION 和协同数据库DEVICE_COLLABORATION
分布式数据服务支持的KV数据模型规格:
(1)设备协同数据库,Key最大支持896Byte,Value最大支持4MB - 1Byte。
(2)单版本数据库,Key最大支持1KB,Value最大支持4MB - 1Byte。
(3)每个应用程序最多支持同时打开16个KvStore。

分布式数据库使用注意事项

1、如果要改数据库字段,需要先关闭数据,删除数据库,再建新的数据库写入数据
2、更新Ui数据需要拿到主线程在任务Runnable中,向UI组件写值

 getUITaskDispatcher().asyncDispatch(new Runnable() {
            @Override
            public void run() {
            //在任务Runnable中,向UI组件写值
}
            })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/299113
推荐阅读
相关标签
  

闽ICP备14008679号