GreenDao介绍
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:
官网地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
GreenDao 优点:
- 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
- 简洁易用的API
- 内存占用小
GreenDao环境配置
在 project 的 build.gradle
- 在 repositories 里面添加
mavenCentral()
- 在 dependencies 里面添加
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
最后的效果
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
在 app 的 build.gradle
- 在第一行
apply plugin: 'com.android.application'
下面增加一行apply plugin: 'org.greenrobot.greendao'
- 在
dependencies
里面添加compile 'org.greenrobot:greendao:3.2.0'
配置GreenDao
greendao{
schemaVersion=1
daoPackage 'com.android.example.demo_greendao.dao'
targetGenDir 'src/main/java'
}
- schemaVersion:数据库schema版本,也可以理解为数据库版本号
- daoPackage:设置相关Dao类(DaoMaster 、DaoSession、Dao)的包名
- targetGenDir:设置要生成DAO文件的目标工程的项目路径
最后的效果
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 23
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.android.example.demo_greendao"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:23.4.0'
testCompile 'junit:junit:4.12'
compile 'org.greenrobot:greendao:3.2.0'
}
greendao{
schemaVersion=1
daoPackage 'com.android.example.demo_greendao.dao'
targetGenDir 'src/main/java'
}
新建实体类
切记:要将id的类型写为Long
,不是小写的long
,否则 id 不能自增长。
@Entity
public class PersonInfo {
@Id
private Long id;
private String name;
private int age;
private String sex;
}
实体@Entity注解
- schema:告知GreenDao当前实体属于哪个schema
- active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
- nameInDb:在数据中使用的别名,默认使用的是实体的类名
- indexes:定义索引,可以跨越多个列
- createInDb:标记创建数据库表
基础属性注解
- @Id :主键 Long型,默认设置自增长,可以通过@Id(autoincrement = true)设置自增长
- @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
- @NotNul:设置数据库表当前列不能为空
- @Transient :添加次标记之后不会生成数据库表的列
索引注解
- @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
- @Unique:向数据库列添加了一个唯一的约束
关系注解
- @ToOne:定义与另一个实体(一个实体对象)的关系
- @ToMany:定义与多个实体对象的关系
点击一个这个绿色的小锤子
然后就会自动生成很多东西
新建一个数据库帮助类
使用单例模式
public class GreenDaoManager {
private DaoMaster.DevOpenHelper helper;
private DaoMaster daoMaster;
private DaoSession daoSession;
private static GreenDaoManager greenDaoManager;
private GreenDaoManager(Context context) {
helper = new DaoMaster.DevOpenHelper(context.getApplicationContext(), "GreenDao_DB");
daoMaster = new DaoMaster(helper.getWritableDb());
daoSession = daoMaster.newSession();
}
public static GreenDaoManager getInstance(Context context) {
if (greenDaoManager == null){
synchronized (GreenDaoManager.class){
if (greenDaoManager == null) {
greenDaoManager = new GreenDaoManager(context);
}
}
}
return greenDaoManager;
}
public DaoMaster.DevOpenHelper getDevOpenHelper() {
return helper;
}
public DaoMaster getDaoMaster() {
return daoMaster;
}
public DaoSession getDaoSession() {
return daoSession;
}
public void closeDB() {
if (helper != null) {
helper.close();
}
}
}
增删改查
增
- 不给id,会自动增长
- 一般情况,我会多写一个不含id的多参构造方法
PersonInfoDao dao = GreenDaoManager.getInstance(this).getDaoSession().getPersonInfoDao();
PersonInfo infoOne = new PersonInfo("留言",22,"男");
dao.insert(infoOne);
查
- 查询全部
List<PersonInfo> personsList = dao.queryBuilder().build().list();
- 有条件的查询
List<PersonInfo> usersListWhere = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq("留言")).build().list();
List<PersonInfo> usersListOrder = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq("留言")).orderAsc(PersonInfoDao.Properties.Age).build().list();
改
List<PersonInfo> usersListModify = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq("留言")).build().list();
for (PersonInfo item:usersListModify) {
item.setName("更新");
dao.update(item);
}
删除
- 有条件的删除
List<PersonInfo> usersListDelete = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq("留言")).build().list();
for (PersonInfo item:usersListDelete) {
dao.delete(item);
}
- 删除全部
dao.deleteAll();
混淆
官方放的位置好隐蔽 官方地址
### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties