比如一个项目的bean对象,有很多个坐标信息,通常服务器把他们当成数组传下来,我们客户端把他们放在List里面,用Gson很容易就解析出来了,一切都是如此完美。突然,要求把这些对象存储在本地数据库,这时候懵逼的发现数据库不支持List这个数据类型,那我们如何保存这种非基础数据类型呢?

{"areaInfo": [{"longitude": 106.4621997480343,"latitude": 29.510238334206996},{"longitude": 106.45794048667334,"latitude": 29.510538137429645},{"longitude": 106.45197740193589,"latitude": 29.50990225016947}],"projectTypeName": "路灯","projectId": "13","projectName": "智博会路灯",
}

一、初级做法

和服务器协议商定将数组转成string类型再传下来,我们直接把这个string存储起来即可。要用时候,再把这个string用Gson解析成List。
这么做显得很low。。。

二、高级做法

room大佬可能想到我们会有这些乱七八糟脑路清奇的想法,给我们提供了类型转换这一高级工具,让我们爱怎么折腾就怎么折腾。

  1. 现在,我们这个bean就要这样写了:
@Entity
public class BeanProject {@PrimaryKey(autoGenerate = true)public int _id;public String address;public String projectId;public String projectName;public List<AreaInfo> areaInfo;public class AreaInfo {public double longitude;public double latitude;}
}

由于这个坐标类过于简单,外部也用不上,我直接写成内部类。

  1. 定义转换器
public class AreaConverter {@TypeConverterpublic static List<BeanProject.AreaInfo> revert(String areaInfoStr) {// 使用Gson方法把json格式的string转成Listtry {return JsonUtil.getReponseBeanList(new JSONArray(areaInfoStr), BeanProject.AreaInfo.class);} catch (JSONException e) {e.printStackTrace();}return null;}@TypeConverterpublic static String converter(List<BeanProject.AreaInfo> areaInfoStr) {// 使用Gson方法把List转成json格式的string,便于我们用的解析return new Gson().toJson(areaInfoStr);}
}
  1. 注解转换器
    @TypeConverters注解,告知数据库要依赖哪些转换类
@Database(entities = {BeanProject.class}, version = 1)
@TypeConverters({AreaConverter.class})
public abstract class DbHic extends RoomDatabase {public abstract DaoProject daoProject();
}

现在可以愉快的使用room给我们带来的便利了。

  1. 查看数据库中存储结果
    我的android studio使用database navigator查看数据库这篇文章有写如何查看数据库。

    可以看到,跟我们预想的一致,List被转换成string存储在本地数据库中。

其他存储方法

room有提供使用外键的方式来存储,但是我看了一下,非常的麻烦,这里不做推荐,有需要的可以参考这篇文章Android room 存储复杂数据类型

参考:

Android架构组件Room的使用

Android room存储高级数据类型相关推荐

  1. android: SharedPreferences存储

    不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的.也就是 说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可 以通过这个键把相应的 ...

  2. C 语言编程 — 高级数据类型 — 字符串

    目录 文章目录 目录 前文列表 字符串 字符串拷贝 字符串比较 strcmp strncmp 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> &l ...

  3. C 语言编程 — 高级数据类型 — 共用体

    目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...

  4. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  5. C 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 前文列表 数组 声明数组 初始化数据 访问数组元素 二维数组 指向数组的指针 将数组指针作为实参传入函数 从函数返回一个数组指针 指针数组 数组名和取数组首地址的区别 前文列表 ...

  6. Python入门篇-高级数据类型集合(set)和字典(dict)

    Python入门篇-高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集合(set) 1>.集合的特点 约定set 翻译为集合c ...

  7. Android数据存储之SharedPreferencesSave存储(保存数据,读取数据的操作)

    GitHub项目地址: https://github.com/Skymqq/SharedPreferencesSave.git 不同于文件的存储方式,SharedPreferences是使用键值对的方 ...

  8. 数据类型_分享redis中除5种基础数据类型以外的高级数据类型

    众所周知,在redis中的数据类型有String(字符串).hash(哈希).list(列表).set(集合).zset(有序集合)五种.但在这5种之外还有高级数据类型. 今天和大家介绍下常用的高级数 ...

  9. Android持久化存储(2)SharedPreferences使用介绍

    1.背景 在用文件存储的时候,我们体验到使用内部存储的方便快捷,即既不用申请权限,也不用指定路径,不过还是有不方便的地方,特别是在存储程序配置信息时,程序的配置信息往往是"键-值" ...

最新文章

  1. 【Python】Pygame入门
  2. 勒索病毒运营团伙的运作流程
  3. IntelJIdea 如何修改控制台字体大小和主题
  4. ASP.NET vNext 概述
  5. python计算卡方分布_如何用Python计算上证指数的涨跌幅分布情况?
  6. lightgbm algorithm case of kaggle(下)
  7. MySQL的Binlog与Redolog
  8. 一个HTML 导航栏下划线跟随效果
  9. ie浏览器跳不出下一个页面怎么回事_用户现在可以在微软Edge Chromium中启动IE模式访问传统老旧网站...
  10. 关于body.clientHeight,body.clientWidht获取的不是可视高度的问题
  11. bzoj2959 长跑 LCT+并查集
  12. C++ cctype头文件里的:isalpha、islower、isupper、isalnum、isblank、isspace函数
  13. Spin和Promela复习
  14. 唐骏解禁回IT:十年之内不跳槽
  15. 20220509数据结构绿书读书笔记
  16. Camtasia 2020 20.0.0 简体中文版 — 屏幕录像软件
  17. 多叉路口交通灯问题,输入任意道口数输出排序解决方案
  18. Towards Robust Vision Transformer论文学习(CVPR2022)
  19. 辨别盗版windows 7
  20. mysql 临时表 两次_重复的临时表MySQL

热门文章

  1. Java实现简单井字棋(OX游戏)V2.0
  2. Android 利用属性动画实现PopupWindow背景逐渐变暗
  3. python3两个三阶矩阵相乘公式_python的几种矩阵相乘的公式详解
  4. Spark—RDD依赖血缘关系
  5. python 基于共现分析赤壁人物关系
  6. 《UC-Net:Uncertainty Inspired RGB-D Saliency Detection via Conditional Variational Autoencoders》论文笔记
  7. 计算机网络管理与维护资料,浅谈计算机网络管理与维护
  8. Python的一些小玩意儿【创建文件夹】
  9. linux进程间通信--消息队列相关函数(ftok)详解
  10. 标准教室照明节能的思考