room使用了有一段时间,在这里记录使用中需要注意的几个地方,基本使用方法,网上很多文章介绍的都很全面,在这里不在阐述了。
1.自定义数据库路径
在使用过程中,有导入导出需求时,难免需要自定义路径,毕竟这样更直观些

@Database(entities = {PhaDrugInfo.class, FeeDetailInvoiceInfo.class,FeeDetailDrugInfo.class}, version = 1 )
public abstract class POSDataBase extends RoomDatabase {//在这里直接定义具体目录就可以private static final String DB_NAME = "/sdcard/CYPOS/cy_pos.db";/*** 单例模式* volatile 确保线程安全* 线程安全意味着改对象会被许多线程使用* 可以被看作是一种 “程度较轻的 synchronized”*/private static volatile POSDataBase INSTANCE;public static POSDataBase getInstance() {// 若为空则进行实例化// 否则直接返回if (INSTANCE == null) {synchronized (POSDataBase.class) {if (INSTANCE == null){INSTANCE = Room.databaseBuilder(POSApplication.getInstance(),POSDataBase.class,DB_NAME).build();}}}return INSTANCE;}
}

2.数据库文件
自定义好数据库之后,在使用过程中,我们发现在目录中共有三个文件,cy_pos.db,cy_pos.db-shm,cy_pos.db-wal,如果我们需要将数据库导出,要将这三个文件都导出,放在同一个文件夹下,在使用工具(例如,navicat sqlite)打开,否则打不开;
另外,我们最好在每个activity onDestory的方法中添加如下:`

if (POSDataBase.getInstance().isOpen()){POSDataBase.getInstance().close();}

这样,退出应用后,我们在打开本地目录中,就会只有一个文件了,其实另外两个应该时类似缓存文件。我们如需收到导入数据,可将这个文件导出操作后在导入。
3.数据库升级
数据库升级分为已有表结构的增删改和增加新表,以有表结构增删改较简单,这里主要讲下新增表,直接上代码:

@Database(entities = {PhaDrugInfo.class, FeeDetailInvoiceInfo.class,FeeDetailDrugInfo.class, SIDiseaseInfo.class}, version = 2 )
public abstract class POSDataBase extends RoomDatabase {private static final String DB_NAME = "/sdcard/CYPOS/cy_pos.db";/*** 单例模式* volatile 确保线程安全* 线程安全意味着改对象会被许多线程使用* 可以被看作是一种 “程度较轻的 synchronized”*/private static volatile POSDataBase INSTANCE;public static POSDataBase getInstance() {// 若为空则进行实例化// 否则直接返回if (INSTANCE == null) {synchronized (POSDataBase.class) {if (INSTANCE == null){INSTANCE = Room.databaseBuilder(POSApplication.getInstance(),POSDataBase.class,DB_NAME)//添加下面这一行.addMigrations(MIGRATION_1_2).build();}}}return INSTANCE;}static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(SupportSQLiteDatabase database) {database.execSQL("CREATE TABLE  IF NOT EXISTS SIDiseaseInfo ( icdid TEXT NOT NULL,areacode TEXT, paykindcode TEXT,icdcode TEXT, icdname TEXT, diseasetype TEXT, diseasesort TEXT, spellcode TEXT, wbcode TEXT, validateflag TEXT,remark TEXT, limitprice TEXT, outwoundapproveflag TEXT, applytreatflag TEXT, ext1 TEXT, ext2 TEXT, ext3 TEXT, ext4 TEXT, ext5 TEXT, ext6 TEXT, ext7 TEXT, opercode TEXT,  PRIMARY KEY(icdid)) ");}};
}

这里需要注意:在新增表之后,Room会对已有数据的表进行检查,当已经存在的数据表跟新的数据表不同时会抛出此异常,我这里就遇到这个问题:

Migration didn't properly handle PhaDrugInfo(com.neusoft.cypos.database.entity.PhaDrugInfo).Expected:TableInfo{name='PhaDrugInfo', columns={FACID=Column{name='FACID', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}Found:TableInfo{name='PhaDrugInfo', columns={FACID=Column{name='FACID', type='TEXT(36)', affinity='2', notNull=false, primaryKeyPosition=0}}}

乍一看感觉很虐心,因为我是新增了其他的表,为什么这个表报错了,后来仔细观察,发现type数据类型有差别,期望的时TEXT,而实际确实TEXT(36),原来是这个表的数据是通过sql语句导入的,sql中定义了数据长度,从而导致了升级时对有数据表的检查没有通过。

所以小伙伴们,在使用数据库时一定到万分注意,还有就是要细心,其实人家已经跟你指出了问题所在,没有无缘无故的bug~

Android Room 数据库使用记录相关推荐

  1. android p获取通话记录_[android] 取得最近通话记录的方法

    经过一下午的研究,终于弄明白了android中,关于通话记录取得的方法.下边是自己的一点心得. final Cursor cursor = cr.query(CallLog.Calls.CONTENT ...

  2. android SQLite数据库的使用

    今天,简单讲讲android如何使用SQLite数据库.  最近,自己在做一个功能时又用到了SQLite数据库,发现自己还是掌握的不很全面.其实之前的app里面也一直用到了数据库,但是自己没有花时 ...

  3. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软 ...

  4. 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)

    [索引页] [×××] 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider) 作者:webabcd 介绍 在 Android 中使用 SQLit ...

  5. Android Room 数据库最佳入门教程

    引言 本文章旨在记录学习Android JetPack库下的Room数据库的使用,不作过于深入原理的讲解,如有问题和建议请留言讨论. 1.Room 库概念及架构示意图 概念 Google的介绍:    ...

  6. android 本地数据库持久化框架,android数据库持久化框架, ormlite框架,

    前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...

  7. android 健康分析,开题报告-基于Android的健康指标记录与分析软件的设计与实现.doc...

    PAGE 盐城师范学院 毕业论文(设计)开题报告 题 目: 基于Android的健康指标记录与分析软件的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 计算机科学与技术 班 级: 12(1) ...

  8. Android MediaProvider数据库模式

    Android MediaProvider数据库模式 摘要: Android MediaProvider 使用 SQLite 数据库存储图片.视频.音频等多媒体文件的信息,供视频播放器.音乐播放器.图 ...

  9. Android Room数据库,不会你就Out了

    Android Architecture Components 系列目录 LiveData原理深入浅出,透过源码看本质 Android Room数据库,用过你才知道好 Android Room数据库 ...

  10. android sqlite数据库加密,(转)SQLite数据库的加密

    1.创建空的SQLite数据库. //数据库名的后缀你可以直接指定,甚至没有后缀都可以 //方法一:创建一个空sqlite数据库,用IO的方式 FileStream fs = File.Create( ...

最新文章

  1. java 常用正则表达式
  2. 苏宁宣布二度涨薪!平均涨幅31%,最高涨幅高达150%!网友:羡慕哭了!苏宁员工:不是全员,跟社招无关!...
  3. SD-WAN的四大错误观念
  4. C#中用NPOI的excel导出
  5. Hibernate框架的配置
  6. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
  7. go语言中的闭包结构
  8. pandas处理丢失数据与数据导入导出
  9. 第四十三篇 面向对象进阶2
  10. synchronized原理_面试必备—Synchronized 关键字使用、底层原理
  11. Spring配置XML本地提示:点击eclipse属性——选择XML Catalog
  12. Python的包(Packages)
  13. 小程序把图片转换成base64
  14. Linux下更改目录及其下的子目录和文件的访问权限
  15. 【矩阵乘法】外部矩阵乘法
  16. uni-app 微信小程序 getuserinfo 获取用户信息 拼音转中文
  17. js表单提交的三种方式
  18. uni H5 苹果手机调微信支付失败
  19. vue实现循环滚动图片
  20. java生成word文档 图片_java生成带有图片的word的文档-Go语言中文社区

热门文章

  1. [Python嗯~机器学习]---用python3来分析和预测加州房价
  2. 长期睡前玩手机的人,会出现这七个问题,不只是反应迟钝!
  3. 【U8+】修改或删除凭证提示此分录两清
  4. 论码流、码率、采样率、比特率、帧速率、分辨率、高清视频的概念
  5. 变更控制委员会CCB
  6. 记一次逗逼的codecraft算法大赛的参赛经历
  7. python实现链表的删除_手把手教你43行代码写红黑树(包括删除操作)
  8. 小鸟云服务器FTP上传中断是什么原因?解决方法总结
  9. struct+Matlab向上向下取整+单位圆向量+matlab求导
  10. php pandoc,Pandoc 标记语言转化工具