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

面向对象思考

共 5053字,需浏览 11分钟

 ·

2021-08-04 23:22

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


通用的设定信息表

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

@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 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。




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

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

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



浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报