专栏首页C++核心准则原文翻译自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

除了地图数据,秒表应用还有一些其他希望保存的数据,例如上次定位的位置,地图画面的缩放比例等。本文介绍通过对象关系映射数据库技术保存这些信息的方法。

通用的设定信息表

下面的代码定义了用于保存设定信息的通用的表结构:

@Entity(tableName = "setting",
        ignoredColumns = {"LABEL"},
        indices = {@Index(value = {"segment", "item"}, name = "setting_index", unique = true)})
public class Setting extends OrmObject {
    static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00301, "Setting");
    @PrimaryKey(autoGenerate = true)
    private Integer id;
    private String segment;
    private String item;
    private String value;

    public Integer getId(){ return id; }

    public String getSegment(){ return segment; }

    public String getItem(){ return item; }

    public String getValue(){ return value; }

    public void setId(Integer integer) { id = integer; }

    public void setSegment(String string) { segment = string; }

    public void setItem(String string) { item = string; }

    public void setValue(String string) { value = string;}
}

表的结构很简单,除了自增长的id之外,字段segment,item和value用于保存设定值信息。

方便使用的帮助方法

为了方便设计者使用这个表,我们还为这个数据表提供了若干帮助函数。首先是向数据库写入数据的setStringValue:

static public void setStringValue(OrmContext db, String seg, String i, String v){
    HiLog.info(LABEL, "Setting.setStringValue,seg=%{public}s, item=%{public}s, v=%{public}s!", seg, i, v);
    OrmPredicates query = db.where(Setting.class).equalTo("segment", seg).and().equalTo("item", i);
    List<Setting> svs = db.query(query);
    String ret = null;
    if (svs.size() > 0) {
        Setting sv = (Setting) svs.get(0);
        sv.value = v;
        db.update(sv);
        HiLog.info(LABEL, "Setting.setStringValue update!");
    }
    else {
        Setting sv = new Setting();
        sv.segment = seg;
        sv.item = i;
        sv.value = v;
        db.insert(sv);
        HiLog.info(LABEL, "Setting.setStringValue insert!");
    }
    db.flush();
}

如果第一次向数据库增加设定项,则调用数据库插入功能;如果相同数据项已经存在,则调用数据库更新功能。

接下来是从数据库获取数据的getStringValue方法:

static public String getStringValue(OrmContext db, String seg, String i, String v){
    //HiLog.info(LABEL, "Setting.getStringValue,seg=%{public}s, item=%{public}s, v=%{public}s!", seg, i, v);
    OrmPredicates query = db.where(Setting.class).equalTo("segment", seg).and().equalTo("item", i);
    List<Setting> svs = db.query(query);
    String ret = null;
    if (svs.size() > 0) {
        Setting sv = (Setting) svs.get(0);
        ret = sv.value;
    } else {
        ret = v;
    }
    return ret;
}

有了这两个存取字符串的帮助方法之后,Setting类又提供了存取其他类型变量的方法:

static public void setIntValue(OrmContext db, String seg, String i, int v){
    setStringValue(db, seg, i, String.format("%d", v));
}

static public int getIntValue(OrmContext db, String seg, String i, int v){
    String str_v = String.format("%d", v);
    String str_ret = getStringValue(db, seg, i, str_v);
    int ret = (int)Double.parseDouble(str_ret);
    return ret;
}

static public void setDoubleValue(OrmContext db, String seg, String i, double v){
    setStringValue(db, seg, i, String.format("%f", v));
    HiLog.info(LABEL, "Setting.setDoubleValue End!");
}

static public double getDoubleValue(OrmContext db, String seg, String i, double v){
    String ret = getStringValue(db, seg, i, String.format("%f", v));
    return Double.valueOf(ret).doubleValue();
}

使用对象关系映射数据库保存设定信息

下面的代码是在秒表应用中实际使用Setting类存取设定值的代码:

private void loadLocation(){
    double latitude = Setting.getDoubleValue(dbContext, getClass().getName(), "latitude", 0);
    double longitude = Setting.getDoubleValue(dbContext, getClass().getName(), "longitude", 0);
    if(latitude != 0 && longitude != 0){
        tileMap.setGcj02Location(new TrailPoint(latitude, longitude));
    }
}
private void saveLocation(){
    TrailPoint location = tileMap.getGcj02Location();
    if(location != null) {
        Setting.setDoubleValue(dbContext, getClass().getName(), "latitude", location.lat);
        Setting.setDoubleValue(dbContext, getClass().getName(), "longitude", location.lon);
    }
}

private void loadSettings(){
    int zoom = Setting.getIntValue(dbContext, getClass().getName(), "zoom", 0);
    if(zoom != 0){
        tileMap.setZoom(zoom);
    }
}

private void saveSettings(){
    Setting.setIntValue(dbContext, getClass().getName(), "zoom", tileMap.getZoom());
}

参考代码

完整代码可以从以下链接下载:

https://github.com/xueweiguo/Harmony/tree/master/StopWatch

参考资料

开发-对象关系映射数据库概述 (harmonyos.com)

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-overview-0000000000030070

开发-对象关系映射数据库开发指导 (harmonyos.com)

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-guidelines-0000000000030063

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学HarmonyOS应用开发(55)- 使用对象关系映射数据库保存地图数据

    前一篇文章实现了地图数据的正确表示,但是由于每次执行都需要至少一次从网上获取地图数据,不可避免地产生显示延迟。本文介绍利用对象数据库储存已经获取的地图数据,从而...

    面向对象思考
  • 自学HarmonyOS应用开发(63)- 对象关系映射数据库升级

    随着应用开发的不断深入,或早或晚都会产生升级数据库结构的需求。这种升级可以是为特定的数据表添加字段,也可以是增加新表等。

    面向对象思考
  • HarmonyOS简介

    前两天,华为发布了HarmonyOS 2.0,俺也赶个时髦,给大家简单介绍下HarmonyOS。

    xiangzhihong
  • 配置鸿蒙Windows烧录环境 && 用Hiburn烧录第一个程序

    如果已安装Visual Studio Code,打开命令行工具,输入code --version命令,检查版本号是否为1.45.1及以上版本;可以正常返回版本号...

    跋扈洋
  • 鸿蒙(HarmonyOS)API的源代码去哪了?竟然全抛出异常,原来使用的是虚拟API!

    不管是鸿蒙(HarmonyOS),或是Android、还是其他系统。理解其工作原理最好的方式就是阅读源代码。不过HarmonyOS的所有系统类,跟踪进去,全部是...

    蒙娜丽宁
  • 面试必备:如何将一个长URL转换为一个短URL?

    前几天整理面试题的时候,有一道试题是《如何将一个很长的URL转换为一个短的URL,并实现他们之间的相互转换?》,现在想起来这是一个绝对不简单的问题,需要考虑很多...

    Java后端技术
  • 程序员看华为HarmonyOS首发

    HarmonyOS代码正式开源,9月10日下午朋友圈散布着这条消息,科技圈炸锅了。各种声音的都有,我也挺好奇的,目前Android、iOS一统江湖,Harmon...

    马上就说
  • 技术分析 | HarmonyOS到底是不是Android套皮?

    最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵的不可开交。

    刘盼
  • 【第22期】HarmonyOS应用开发(基础篇)

    这不就是说,以后华为手机都是鸿蒙系统了嘛?鸿蒙还发出了一条视频,视频中显示2021年6月2号将开启鸿蒙操作系统及华为全场景新品发布会。预计现在支持EMUI11升...

    siberiawolf
  • 《鸿蒙理论知识03》HarmonyOS概述之系统安全

    在搭载 HarmonyOS 的分布式终端上,可以保证“正确的人,通过正确的设备,正确地使 用数据”。 通过“分布式多端协同身份认证”来保证“正确的人”。

    阿峰博客
  • Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训。)~~~ 1:Hibernate的关联映射,存在一...

    别先生
  • 重发和重定向有什么区别与重定向应用

    第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向...

    王小明_HIT
  • 《鸿蒙理论知识04》HarmonyOS概述之系统定义

    【摘要】 系统定位 HarmonyOS 是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体 娱乐等)的分布式操作系统。在传统的单设备系统能力的基...

    阿峰博客
  • HarmonyOS与Android的全面对比

    第二是我个人非常看好鸿蒙系统的未来,清楚明白华为和一些民族企业担负的责任和国人的期待,虽然带着一些民族感情;鸿蒙刚发布的时候自己是非常激动的,但是后来项目太忙一...

    肉眼品世界
  • 展现鸿蒙的独特魅力:跨设备调用窗口(Page Ability)

    HarmonyOS的核心特性(或称为卖点)之一就是软总线技术,而Page Ability的跨设备迁移是软总线的一个具体技术实现。所谓跨设备迁移Page Abil...

    蒙娜丽宁
  • HarmonyOS 生态,投入还是继续观望?

    HarmonyOS 2.0 从首次亮相至今快满一年,回顾过去一年里的关键节点:2020 年 9 月在华为开发者大会上,HarmonyOS 2.0 首次亮相;20...

    深度学习与Python
  • HarmonyOS-对Android开发者也太友好了吧

    2020年9月10日,华为消费者业务软件部总裁王成录又一次站在了松山湖华为开发者大会的主舞台上。今年,他带来了万众瞩目的华为鸿蒙HarmonyOS2.0...

    Android扫地僧
  • 基于 Hi3861 平台的 HarmonyOS Device 开发体验

    编程界有个传承了几十年的”规矩“--入门先从环境搭建开始,有的时候环境搭建比较简单,比如学习 HTML 编程,有浏览器就行;有时候又比较繁琐,比如 React ...

    胡琦
  • 自学鸿蒙应用开发(41)- 真机调试之准备调试证书

    启动DevEco Stduio之后,通过主菜单选择Build->Generate Key and CSR。

    面向对象思考

扫码关注云+社区

领取腾讯云代金券