前言
之前用过许多的Orm框架,例如:ORMLite、greendao、ormndroid、androrm、ActiveAndroid,SugarORM等等,不过都没有一一研究,感觉GreenDao的文档和支持率比较高,所以就一直采用了GreenDao作为项目的Orm框架
我们今天就来讲讲如何使用GreenDao3
介绍
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。关于greenDAO的概念可以看官网greenDAO
greenDao优势
1、一个精简的库
2、性能最大化
3、内存开销最小化
4、易于使用的 APIs
5、对 Android 进行高度优化
6、秒胜当前市面上的其他Orm框架(这个也是看总体水平,也是我为什么推崇大家用次框架的重要理由,既然要学就要学最要好用的)
步骤
第一步、首先导入项目
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}
在build.gradle中配置版本和路径
整体如下
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
greendao {
schemaVersion 1 //我们的数据库的版本号 当数据库升级的时候可以在这里改版本
daoPackage 'com.hsm.bxt.db' //自动生成的DaoMaster、DaoSession、Dao的包名 根据自己想放的位置改变即可
targetGenDir 'src/main/java' //自动生成的DaoMaster、DaoSession、Dao的路径
}
dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}
第二步、创建一个User的实体类
@Entity
public class User {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount; // not persisted
}
1.实体@Entity注解
- schema:告知GreenDao当前实体属于哪个schema
- active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
- nameInDb:在数据中使用的别名,默认使用的是实体的类名
- indexes:定义索引,可以跨越多个列
- createInDb:标记创建数据库表
2.基础属性注解
- @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
- @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property(nameInDb="name")
- @NotNul:设置数据库表当前列不能为空
- @Transient :添加次标记之后不会生成数据库表的列
3.索引注解
- @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
- @Unique:向数据库列添加了一个唯一的约束
4.关系注解
- @ToOne:定义与另一个实体(一个实体对象)的关系
- @ToMany:定义与多个实体对象的关系
编译项目,User实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;
第三步、MakeProject
编译项目,User实体类会自动编译,生成get、set方法并且会在com.anye.greendao.gen目录下生成三个文件;
第四步、初始化
public class MainActivity extends AppCompatActivity {
private UserDao userDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaoMaster.DevOpenHelper devOpenHelper=new DaoMaster.DevOpenHelper(this,"mydb.db",null);
DaoMaster daoMaster=new DaoMaster(devOpenHelper.getWritableDb());
DaoSession daoSession=daoMaster.newSession();
}
1.增加单个数据
userDao = daoSession.getUserDao();
User user=new User((long)1,"张三");
userDao.insert(user);
如果创建表的时候,设置的id自增,即
@Id(autoincrement = true)
,那么这里的id传值直接null就为自动增长,即为User user=new User(null,"张三");
1.1.增加多个数据
List stuList = new ArrayList();
stuList.add(new User((long)2,"李四");
stuList.add(new User((long)3,"王五");
stuList.add(new User((long)4,"赵六");
userDao.insertInTx(stuList);
2.删除
//删除指定id
userDao.deleteByKey(id);
//删除指定数据
userDao.queryBuilder().where(UserDao.Properties.Name.eq("张三")).buildDelete().executeDeleteWithoutDetachingEntities();
//删除所有
userDao.deleteAll();
这里讲解一下删除指定数据,·
userDao.queryBuilder().where()
是从那里获取数据,而UserDao.Properties.Name.是指定数据,有以下方法
和java中的代码有相同指出,比如ge(“张三”),则张三1,张三2,张三3都会删除。 eq(“张三”)只会删除张三,between删除那两个数据间的所有数据,gt除了“张三”其余张三1,张三2都删除,le小于等于数据
这里需要注意的一点就是如果删除所有数据,id是从1从新开始,如果id1-id15删除id10-15,那么id从10开始,也就是说id从上一位id自增长
3.查询
3.1查询所有
List joes = userDao.queryBuilder()
//通过LastName进行正序排序
.orderAsc(Properties.LastName)
.list();
3.2查询指定为“job”名字的数据
List joes = userDao.queryBuilder()
//查找FirstName=“job”的所有数据
.where(Properties.FirstName.eq("Joe"))
//通过LastName进行正序排序
.orderAsc(Properties.LastName)
.list();
就是第一行改变了,所以也不是很难
3.3查询指定数据并按顺序排列
代码只有第一行不一样,所以只贴一下第一行,orderAsc升序,orderDesc降序
List stuList = stuDao.queryBuilder().where(StudentDao.Properties.StuName.eq("张三")).orderDesc(StudentDao.Properties.Id).list();
3.4组合查询数据 查询姓名为"张三" 并且年龄小于等于25
比如我们在增加一个年龄age一项
QueryBuilder stuQB = stuDao.queryBuilder();
stuQB.where(StudentDao.Properties.StuName.eq("张三"), StudentDao.Properties.StuScore.le("25"));
List stuList = stuQB.list();
3.5查询所有返回数据 但只返回前三条数据
List stuList = stuDao.queryBuilder().limit(3).list();
3.6查询所有返回数据 但只返回前三条数据 并且跳过第一条数据
List stuList = stuDao.queryBuilder().limit(3).offset(1).list();
3.7查询所有信息总条数
int stuSumCount = stuDao.queryBuilder().list().size();
4.更新指定信息
Student student = stuDao.queryBuilder()
.where(StudentDao.Properties.StuName.eq("张三"))
.build()
.unique();
if (student != null) {
student.setStuName("I Love You");
stuDao.update(student);
}
4.1批量更新
WhereCondition eq = QuestionDao.Properties.Iscollect.eq(true);
SqlUtils.plupdate_question(false,getApplicationContext(),eq);
for (int i = 0; i < list.size(); i++) {
list.get(i).setIscollect(false);
}
questionList.notifyDataSetChanged();