首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息

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

作者头像
面向对象思考
发布2021-08-06 13:17:44
5180
发布2021-08-06 13:17:44
举报

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

通用的设定信息表

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

@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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完整代码可以从以下链接下载:
  • 开发-对象关系映射数据库概述 (harmonyos.com)
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档