使用GreenDao操作已有的 .db 数据库

使用GreenDao操作已有的 .db 数据库

编者序

如果你项目中使用了GreenDao的话其实一些建库、建表的操作都对你隐藏了,你只根据XXXDao类就可以为所欲为的增删改查了。本篇不会花篇幅讲解如何配置GreenDAO,现在的GreenDAO配置起来简直比之前版本的舒服太多了,不会的自己爬文章学习下,不下十分钟你就可以配置完成。然后再稍微理解下ORM(对象关系映射)框架是个啥就可以开始本文的阅读了。

我在项目中遇到了什么问题呢,就是 城市定位 功能,本来一个简简单单的城市定位功能但从Android开发来说本不是问题,但是这个定位结果呢需要跟微信小程序以及后台要保持一样的数据格式,也就是说城市的名字啦,省份下的区域啦,都要保持一致。说的很迷糊,我们上图,左边是从网上拷贝的一份JS城市文件,然后改成了JSON格式。右图是我们按照左侧的格式然后对照 小程序的城市选择器(小程序自带的组件) 一个个手动改出来的(不要问为什么,可能我们闲的吧)。改完结果如下,小程序选择器里没有台湾,香港,澳门。然后北京市下的叫北京市,然后市下面分了很多区,其他地方也是这种大同小异的改变。改完后我们就按照最右边的这种(也就是向小程序妥协)作为了前端后台移动端小程序端统一的地区格式,然后分别生成了JS和JSON文件,JS文件前端后台会去调用,JSON格式的文件交给移动端去使用。
在这里插入图片描述

但是在城市选择器的过程中,我偷懒使用了GitHub上的一个开源的城市选择器CityPicker,非常感谢作者,省去了我很多时间。但是这个选择器不能自定义城市的数据源,我只能下载源码查看作者怎么实现的了,工程目录打开就看到作者使用的是assets文件夹下的china_cities_v2.db城市数据库。
打开这个数据库文件,可以看到城市的数据源是这个样子的,天呐,名字不一样,北京后面没有“市”字(捂脸):
在这里插入图片描述
所以这就是问题的由来,我们的目的就是把定义好的城市的数据源,也就是JSON格式的数据,替换到china_cities_v2.db数据库中(可能程序员天生爱折腾吧,捂脸)。

准备条件

  • 新建工程,将的JSON格式文件 area_190114.json和数据库文件 china_cities_v2.db放到assets文件夹中去。
  • 配置GreenDAO。

代码

该部分共有两步:

1、将数据库文件拷贝到应用的database文件夹下

因为无法直接操作assets文件夹下的数据库,所以我们只能将其拷贝到应用下数据库专用的databases文件夹中。
代码如下,不考虑已有数据库等其他情况,只做拷贝:

    private void copyDataBase() throws IOException {
        InputStream myInput = this.getAssets().open(DB_NAME);
        File outFileName = this.getDatabasePath(DB_NAME);

        outFileName.getParentFile().mkdirs();
        OutputStream myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

执行完该步骤之后可以在AS中打开 Device File Explorer ,然后在 data -> data -> 你应用的包名 -> databases 文件夹下就可以看到你拷贝进来的数据库啦,如下所示。
在这里插入图片描述

2、使用GreenDAO操作数据库

使用GreenDAO操作该数据库的话需要新建一个城市的实体类,因为我们需要修改数据库中的城市表。如下,字段要一一对应:

@Entity(
        nameInDb = "cities",
        createInDb = false
)
public class City {

    @Id
    @Property(nameInDb = "id")
    public Long id;

    @Property(nameInDb = "c_name")
    private String name;

    @Property(nameInDb = "c_province")
    private String province;

    @Property(nameInDb = "c_pinyin")
    private String pinyin;

    @Property(nameInDb = "c_code")
    private String code;

}

有几点需要注意:

  • @Entity(nameInDb = “cities”,createInDb = false) ,nameInDb是该表在数据库中的名字,见上文数据库图片中的表名。createInDb这里因为我们使用的是已有的数据库表,所以不需要新建表。

  • @Property(nameInDb = “c_code”) ,这里是属性的注解,也要跟表中的字段名一一对应。然后属性的类型也不要出错比如是Long类型的id,而不是int类型的id。

这个类创建好后点击Build -> Make Project,项目会自动构建,并插入相应的代码。构建完成后我们开始使用GreenDAO进行操作:

DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(
                this, DB_NAME, null);
DaoMaster daoMaster = new DaoMaster(openHelper.getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
CityDao cityDao = daoSession.getCityDao();
//先删除原先数据库中的所有数据
cityDao.deleteAll();
//这里是从JSON中获取到所有城市,返回的一个城市列表,然后循环执行插入操作
List<City> cities = AreaUtils.getAllCities(this);
for (City city : cities) {
    cityDao.insert(city);
}

上述代码操作完成后将修改后的数据库文件导出查看,是不是,“北京”变成“北京市”了,其他的也都搞定:
在这里插入图片描述

至此,折腾完毕,至于这折腾合不合理还不是产品经理一句话的事(捂脸)。

文中还使用到了字符串转拼音的开源库promeG/TinyPinyin,感谢作者。

附件

附上修改后的JSON文件以及修改后的数据库文件

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值