自学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

作者著作介绍

《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621047.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Git企业开发控制理论和实操-从入门到深入(七)|企业级开发模型

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

模2运算规则

模2加法 模2加法没有进位&#xff0c;等同于异或运算。一位数的模2加法规则如下&#xff1a; 0 0 0 0 1 1 1 0 1 1 1 0 多位数的模2加法中&#xff0c;每一位都按照上面的规则进行&#xff0c;例如: 当多个数相加&#xff0c;对应位置上如果有偶数个1&#xff0c;…

知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现,本篇文章,我将指导大家如何使用py2neo和Neo4j构建一个实用的超市商品知识图谱和推荐系统。该系统可以帮助用户快速找到感兴趣的商品,并提供个性化的推荐服务…

pygame实现物体运动拖尾尾迹

文章目录 前言主要内容讲解&#xff1a;代码 总结更多宝藏 前言 &#x1f60e;&#x1f973;&#x1f60e;&#x1f920;&#x1f916;&#x1f648;&#x1f4ad;&#x1f373;&#x1f371; 本文我们来讲一下如何使用pygame实现一个拖尾特效。 主要内容 &#x1f99e;&am…

pe_xscan 增加 O31 项

O31项 对应的项目&#xff1a; 开机、关机脚本 用户登录、注销脚本

LeetCode第1~5题解

CONTENTS LeetCode 1. 两数之和LeetCode 2. 两数相加LeetCode 3. 无重复字符的最长子串 LeetCode 1. 两数之和 【题目描述】 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。…

linux下运行win10效果好不好,Win10不好用?继续坚守Win7的人依然巨多

前不久&#xff0c;微软发布消息称Windows 10操作系统市场占有率终于突破50%。而近日&#xff0c;安全厂商卡巴斯基发布的8月下旬最新研究报告也印证了这一点&#xff0c;并且从数据来看&#xff0c;Windows 10系统的占有率还有小幅度的增长&#xff0c;达到了53%左右。 退休时…

其实win10要比win7的安全性强很多

随着win10系统的一步步更新&#xff0c;用户体验度也越来越好&#xff0c;更多的用户也换了win10的系统&#xff0c;但还是有一部分用户依然雷打不动的信任着win7。下面小编来分析一下win7和win10到底有着怎样的差别&#xff0c;相信看完下文&#xff0c;你也会想升级win10系统…

W7-2495X参数 至强W72495X功耗

W7-2495X采用10纳米工艺二十核心四十线程CPU主频 2.6GHz动态加速频率 4.8GHz 热设计功耗(TDP) 225W支持最大内存容量 2TB内存类型 DDR5 4800MHz W7-2495X性能怎么样这些点很重要 http://www.adiannao.cn/du

电脑装了w10没有w7流畅怎么办?

如果我们对自己的电脑进行了系统的重装&#xff0c;在电脑装了win10系统之后发现没有win7流畅的话&#xff0c;很多小伙伴不知道是什么情况应该怎么解决。 那么据微点阅读小编所知可能是我们电脑硬件设施的不兼容所导致的。我们可以在官网上查看win10系统的配置要求是否符合自…

W7-2475X参数 至强W72475X功耗

W7-2475X采用10纳米制作工艺二十核心四十线程CPU主频 2.6GHz动态加速频率 4.8GHz 热设计功耗(TDP) 225W支持最大内存容量 2TB内存类型 DDR5 4800MHz W7-2475X性能怎么样这些点很重要 http://www.adiannao.cn/du

Intel 至强 W7-3465X参数 W73465X功耗

至强 W7-3465X采用10纳米 制作工艺 二十八核心五十六线程CPU主频 2.5GHz动态加速频率 4.8GHz热设计功耗(TDP) 300W支持最大内存容量 4TB 内存类型 DDR5 4800MHz W7-3465X性能怎么样这些点很重要 http://www.adiannao.cn/du

五类造成Windows 7假死的原因及处理

Windows 7虽好&#xff0c;可是小问题不断。从Beta版本至今&#xff0c;很多朋友遇到最严重的问题就是资源管理器偶尔或者经常失去响应&#xff0c;虽然不是什么非重装的问题&#xff0c;但是时不时电脑卡上一段时间&#xff0c;谁都觉得很烦。那么到底Windows 7在哪些情况下会…

高傲的win7

高傲的win7 首先为win7证明&#xff1a;本文内容和本人下载的系统版本以及硬件细节有关&#xff0c;并不能代表所有的win7种族。 好久没有写博客了&#xff0c;主要是因为把很多东西都记录在笔记里边了&#xff0c;但是感觉写博客和笔记还是不太一样&#xff0c;笔记就是随时…

我对windows7简单评论

10月25日受朋友的邀请参加了弘博软件教育学院成功举办的windows 7发布会 发现不止是我一个对windows 7偏爱有加。这里这里在座师生也是windows7 的粉丝。 windows 7发布会一次又一次的成举办功也源于它独特的性能&#xff0c;带给我们的方便、快捷。 经过我近一个月的使用&…

09年IT界最愚蠢的九件事 Windows7精简版UAC上榜(转)

据国外媒体报道&#xff0c;临近岁末&#xff0c;资讯网站eWeek于上周评出了《九款年度重磅产品》。无独有偶&#xff0c;该网站此番又评选出2009年度最不受用户欢迎的九大事件&#xff1a; 1、亚马逊删书门 今年七月份&#xff0c;在线销售巨人亚马逊&#xff08;Amazon&…

历经十年,还有一个月,Windows 7 生命周期将结束,相信很多人还是觉得win7不错的

距离 Microsoft 终止对 Windows 7 的支持只剩一个月的时间了,到 2020 年 1 月 14 日,这款经典的操作系统就要和大家 say goodbye 了。 2009 年 7 月 4 日,Windows 7 正式开发完成,到现在已经整整 10 岁。它在 Vista 前辈的基础上发展而来,界面友好,功能强大,使用高效,因…

服务器装系统步骤图解win7,w7系统重装步骤是怎样的|w7重装系统教程图解

w7系统是当前最稳定&#xff0c;也是最主流的系统&#xff0c;不过w7系统在使用过程也会出现系统故障&#xff0c;有些甚至出现系统崩溃不能启动的问题&#xff0c;这时候就需要重装系统&#xff0c;那么w7系统重装步骤是怎样的呢&#xff1f;w7重装系统一般有三种方式&#xf…

基于阿基米德优化算法优化的BP神经网络(预测应用) - 附代码

基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.阿基米德优化优化BP神经网络2.1 BP神经网络参数设置2.2 阿基米德优化算法应用 4.测试结…

为何依然有很多用户不愿舍弃Windows7?

微软早在2016年7月29日之后就关闭了免费升级到Windows10的通道&#xff0c;但是那之后可以通过辅助技术通道免费将Windows7和Windows8.1升级到Windows10&#xff0c;直到12月31日完全关闭&#xff0c;此后用户升级到Windows10需要付费&#xff0c;不过为何还是有那么多的用户喜…