DevEco Studio开发鸿蒙app经验分享:创建数据库及与华为云连接

您所在的位置:网站首页 华为鸿蒙系统在哪里开源服务器 DevEco Studio开发鸿蒙app经验分享:创建数据库及与华为云连接

DevEco Studio开发鸿蒙app经验分享:创建数据库及与华为云连接

2024-07-15 16:23:53| 来源: 网络整理| 查看: 265

DevEco Studio开发鸿蒙app经验分享:创建数据库及与华为云连接

更新时间:2021-12-15 15:58:41浏览次数:740+次

以下将HarmonyOS工具DevEco Studio开发鸿蒙app经验分享给大家,功能有两个,一是创建数据库,实现登录注册功能,二是与华为云连接,获取硬件上传至华为云的数据。

实现过程

一、创建数据库

与安卓开发不同,在DevEco Studio中创建数据库时,直接新建data ability即可,如下图所示:

\

创建完成后,则会出现基本的代码框架。根据需求,填写相应的数据库名称,表名,字段名称等。部分代码如下:

private static final String DB_NAME = "xxxx.db";

private static final String TABLE_NAME="xxxx";

private static final String xxxxx = "xxx";

private static final String xxxx = "xxxx";

private static final String xxxx = "xxxx";

private DataAbilityHelper helper;

private StoreConfig storeConfig = StoreConfig.newDefaultConfig(DB_NAME);

private RdbStore rdbStore;

private RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() {

    @Override

    public void onCreate(RdbStore rdbStore) {

        rdbStore.executeSql("create table if not exists "

                + TABLE_NAME + " ("

                + xxxx+ " text not null, "

                + xxx+ " text not null, "

                + xxxx+ " text not null)");

    }

    @Override

    public void onUpgrade(RdbStore rdbStore, int i, int i1) {

    }

};

ps:此处一定注意rdbStore.executeSql中的空格,很有可能因为空格而创建失败。

接下来在onStart方法中编写代码:

public void onStart(Intent intent) {

    super.onStart(intent);

    DatabaseHelper databaseHelper = new DatabaseHelper(this);

    rdbStore = databaseHelper.getRdbStore(storeConfig,1,rdbOpenCallback,null);

}

此处给出往数据库中插入数据的方法:

@Override

public int insert(Uri uri, ValuesBucket value) {

    HiLog.info(LABEL_LOG, "DataAbility insert");

    String path = uri.getLastPath();

    if (!"data".equals(path)) {

        HiLog.info(LABEL_LOG, "DataAbility insert path is not matched");

        return -1;

    }

    ValuesBucket values = new ValuesBucket();

    values.putString(DB_COLUMB_NAME, value.getString(DB_COLUMB_NAME));

    values.putString(DB_COLUMN_PASS, value.getString(DB_COLUMN_PASS));

    value.putString(DB_COLUMN_PHONE,values.getString(DB_COLUMN_PHONE));

    int index = (int) rdbStore.insert(TABLE_NAME, values);

    DataAbilityHelper.creator(this, uri).notifyChange(uri);

    return index;

}

至此,数据库就创建成功了。下面介绍如何在注册页面中实现注册功能。

首先定义一个helper,再定义uri,注意,uri在config.json中会有,粘过来即可:

private DataAbilityHelper helper;

Uri uri = Uri.parse("xxxxx");

然后在onStart方法中编写代码:

public void onStart(Intent intent) {

        super.onStart(intent);

        super.setUIContent(ResourceTable.Layout_ability_register);

        helper = DataAbilityHelper.creator(this); //数据库的操作都是通过helper进行的

        Button insert_again=(Button)findComponentById(ResourceTable.Id_insert_again);  //注册按钮

        insert_again.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                username = usrname.getText().toString().trim();//获取用户名

                pass = password.getText().toString().trim();  //获取密码

                get_phone = phone.getText().toString().trim();  //获取手机号码

             //向数据库中插入数据

                ValuesBucket valuesBucket = new ValuesBucket();

                valuesBucket.putString(DB_COLUMB_NAME,username);

                valuesBucket.putString(DB_COLUMN_PASS,pass);

                valuesBucket.putString(DB_COLUMN_PHONE,get_phone);

                try {

                    helper.insert(uri,valuesBucket);

                    toastDialog.setText("注册成功").show();

                    usrname.setText("");

                    password.setText("");

                    phone.setText("");

                    Intent intent1 = new Intent();

                    present(new TemperatureSlice(),intent1);

                    terminate();

                } catch (DataAbilityRemoteException e) {

                    e.printStackTrace();

                }

            }

        });

    }

至此,就完成了注册功能。

二、与华为云连接

与华为云连接一般有两种方式,可以用官方给出的APK进行连接,另一种是搭建一个本地服务器,华为云将数据转发至本地服务器,手机app再从服务器获取数据并显示。

本地服务器采用Tomcat搭建。

需要进行内网穿透。

在华为云IotDA->规则->数据转发页面创建一个新的规则,选择使用HTTP协议进行数据转发,并将服务器地址填写进去。

最后,要启动规则,并在设备联动中设置触发规则。

至此,完成了华为云向服务器转发数据的功能。

手机app需要获取服务器数据,就需要与服务器之间建立连接,我们选择HTTP方式进行连接。

在安卓开发中,模拟机默认的外部地址是10.0.2.2,但鸿蒙的模拟机并不是这样。它是部署在云端的真机,因此我们需要一个地址,该地址要求输入到鸿蒙模拟机中的浏览器是可以直接访问的。

我们使用了“花生壳”软件进行内网穿透,获得了一个域名,然后再使用HTTP连接的"GET"方法,就可以获取到由华为云端发送至服务器的json数据。

安卓开发中有JSONObject可以对json数据进行解析,鸿蒙中没有该方法,因此需要添加一个外部依赖的包,Jackson,对json数据进行解析。

解析的部分代码如下:

public void get_json(String data) throws JsonProcessingException {

    ObjectMapper objectMapper = new ObjectMapper();

    JsonNode jsonNode =objectMapper.readTree(data);

    JsonNode body = jsonNode.get("notify_data");

    JsonNode s = body.get("body");

    JsonNode k = s.get("services");

    JsonNode o = k.get(0);

    JsonNode a = o.get("properties");

    JsonNode g= a.get("XXX");   //此处需要填写在IotDA中的属性名称

    JsonNode e= a.get("XXX");

}

完成json格式的解析后,就可以将其更新在UI中。

此处会出现一个问题,与服务器之间建立连接需要在子线程中操作,而更新UI在主线程中操作,此处就涉及到线程间的通信问题。

在安卓开发中,可以使用Handler()方法实现线程间的通信功能,在鸿蒙中,可以使用如下方法:

首先定义三个变量:

private EventHandler myEventHandler5;

private EventRunner runnerA;

private EventRunner eventrunner;

再定义一个任务分发:

TaskDispatcher schule = createParallelTaskDispatcher("schdule", TaskPriority.DEFAULT);

runnerA=EventRunner.create(false);

eventrunner = EventRunner.getMainEventRunner();

接下来就可以在myEventHandler5中定义操作:

myEventHandler5 = new EventHandler(eventrunner){

    @Override

    protected void processEvent(InnerEvent event) {

        super.processEvent(event);

        if(event==null){

            return;

        }

        int eventId = event.eventId;

        switch (eventId){

            case 1: {

             //更新UI操作

                break;

            }

            case 2:

            {

                break;

            }

            default:

                break;

        }

    }

};

然后在线程中:

public void run() {

    while (true){   //此处写成死循环,是为了让APP与服务器一直通信,若没有这句,则连接只进行一次

        try {

            msg = HttpGet(path);    //与服务器进行连接,并获取json格式数据

            myEventHandler5.sendEvent(1);//向主线程发送eventID为1的事件,即更新UI

            Thread.sleep(5000);   //线程睡眠5s再进行连接

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

至此,就完成了获取数据并更新在UI的功能。

说明

作者才疏学浅,代码有问题或者解释有误的地方还请见谅。

将这一段开发经历与大家分享,主要也是因为鸿蒙开发相关资料在网上较少,我也是借鉴了不少优秀博主的经验贴以及鸿蒙社区高手的帮助,才基本实现了一些简单的功能。

若有问题或者错误,欢迎各位鸿蒙开发者批评指正。

相关参考:鸿蒙开发者分享,C语言编写鸿蒙手机软件方法。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭