GreenDao:
GreenDao是近段时间比较流行的数据库框架,当然优先选择GreenDao,不过在使用这个数据库的时候真的有许多需要注意的地方,我在下面先列举一下,以后遇到问题都回来更新自己的博客。
优势:
- 性能最大化
- 内存开销最小
- API 简单好用
- 对Android 高度优化
- 2.2版本以上还支持加密数据库
- 支持protobuf协议存储(protobuf 比json更快,google的优秀产品,因此greendao能很好地与retrofit 2.0结合protobuf网络请求并缓存)
Android5.0以下报错信息:
----先稍微讲讲GreenDao在配置时要配置的注意项-------------------------
集成
首先估计大家都是要先集成数据库,我要告诉大家的是在GreenDao3.0之前需要新建一个model来进行辅助创建,但是在GreenDao3.0以后集成数据库更简单了,不用再新建model了,当然,你要是一定要新建,也是可以的;
关于集成到项目使用,大家参考我的另一篇博客:GreenDao3.2的使用,让你本地数据库操作坐上了高铁
具体新建Bean类后怎么与GreenDao关联等步骤这里就不细说,参见GreenDao3.2的使用,让你本地数据库操作坐上了高铁
集成之后要注意,GreenDao进行自定义代码生成位置,如果我们不自定义,就会生成在build文件夹里,当然这样虽然简单,但是看起来不是很直观,所以我们要自己自定义一个生成数据库代码的位置,怎么做呢?
不进行代码自动生成的位置配置,就会在如下图中位置出现。
当然不进行位置生成文件夹指定,也不影响功能使用。
配置:
app/build.gradle/ 的
android {
compileSdkVersion 25
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.demo.xxx"
minSdkVersion 16
targetSdkVersion 25
....
....
}
greendao {
//数据库的schema版本,也可以理解为数据库版本号
schemaVersion 1
//设置DaoMaster、DaoSession、Dao包名,也就是要放置这些类的包的全路径。
daoPackage 'com.demo.xxx.greendao'
//设置DaoMaster、DaoSession、Dao目录
targetGenDir 'src/main/java'
// generateTests false //设置为true以自动生成单元测试。
// targetGenDirTests 'src/main/java' //应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
}
}
- daoPackage : 设置DaoMaster、DaoSession、Dao包名,也就是要放置这些类的包的全路径。"com.demo.xxx"是你项目的applicationId
- schemaVersion :数据库版本号,涉及到数据库字段的增删或者其他都会进行版本的增加等
- targetGenDir : 'src/main/java' ,设置DaoMaster、DaoSession、Dao目录
- 这里比较重要的是要设置schemaVersion
创建实体
创建实体,来生成我们的数据库
具体新建Bean类后怎么与GreenDao关联等步骤这里就不细说
写完实体类,点击菜单栏中的build一下项目,会生成DaoMaster等类文件
这里我创建的示例实体为NFCInfoBean.java
编译之后就会在项目的com.demo.xxx.greendao文件夹下生成一个NFCInfoBeanDao.java文件
编译项目
配置好引入与基本配置后,我们要进行项目编译生成GreenDao的自动生成的文件。DaoMater、DaoSession...
编译:菜单build/Make Project
这就生成在我们自定义的包里面了
这样我们就可以去使用GreenDao数据库的增删改查了,至于怎么去操作,网上有很多教程。
要解决的问题是什么呢?
就是版本兼容问题,我不知道大家有没有遇到过,就是我们在使用GreenDao数据库的时候会发现,在android5.0以上的系统版本,没什么问题,我们可以正常运行,这也没问题,但是在android5.0以下版本就会报错,报什么错呢?很奇葩,大家直接看代码:
在GitHub上面,issue出现了这个问题,但是GreenDao团队给出的回答是这样的 :
有没有很模糊,其实他也说是分包的问题,这里我声明一下,的确是分包问题,首先在android5.0以上不牵扯MultiDex分包问题,但是在android4.4甚至以下版本就有这个,但是怎么解决呢?我们需要引入一个包:
implementation 'com.android.support:multidex:1.0.0'
引入这个来解决分包问题
1.引入方式:
- 从sdk\extras\android\support\multidex\library\libs 目录将android-support-multidex.jar导入工程中
- app/build.gradle/ 文件中
dependencies { implementation 'com.android.support:multidex:1.0.0' }
2.引入配置注意:
如果你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类,
如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法:
一. 从sdk\extras\android\support\multidex\library\libs 目录将android-support-multidex.jar导入工程中
二. 如果你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类,
如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法:
public class MyApplication extends XXXApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
然后这样的话就可以解决我们的项目在android4.4以下版本中报错找不到java.lang.NoClassDefFoundError: org.greenrobot.greendao.database.StandardDatabase
结语:
相关文章:
Android 使用android-support-multidex解决Dex超出方法数的限制问题
非常感谢 事情往往烟消云散 同学的这篇博客,如果大家还有什么问题,可以留言。