GreenDao简单用法
2018-12-04 本文已影响133人
世道无情
1. 概述
这里记录下greendao的简单用法,常用的就是增删改查,这里是参照下边这位大神博客自己写的demo;
https://blog.csdn.net/ht1063899049/article/details/78519723
2. 使用
第一步:在项目的 build.gradle中添加下边依赖:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
图片.png
第二步:在app的 build.gradle中添加下边依赖:
//使用greendao
apply plugin: 'org.greenrobot.greendao' // apply plugin
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.novate.greendao.db'// 设置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}
compile 'org.greenrobot:greendao:3.2.2' // add library
图片.png
图片.png
第三步:自定义一个实体类,User
自己只需要写下边的即可
图片.png
然后 build --> Make Project
图片.png
此时会在db包下生成如下图的3个类:
图片.png
同时,User实体类也会生成一些代码,如下:
package com.novate.greendao;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
/**
* ================================================
* Email: 2185134304@qq.com
* Created by Novate 2018/11/28 7:42
* Version 1.0
* Params:
* Description: 实体类
*
* 备注:Bean 对象注释的解释
* @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
@Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
@Property:可以自定义字段名,注意外键不能使用该属性
@NotNull:属性不能为空
@Transient:使用该注释的属性不会被存入数据库的字段中
@Unique:该属性值必须在数据库中是唯一值
@Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
* ================================================
*/
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
private int age;
private String sex;
@Generated(hash = 689493095)
public User(Long id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
@Generated(hash = 586692638)
public User() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
第四步:AppApplication代码如下
/**
* ================================================
* Email: 2185134304@qq.com
* Created by Novate 2018/11/28 7:44
* Version 1.0
* Params:
* Description:
* ================================================
*/
public class AppApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static AppApplication instances;
/**
* 单例模式
*/
public static AppApplication getInstances() {
return instances;
}
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
private void setDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
第五步:在MainActivity中定义4个按钮,分别为添加、删除、修改、查询,代码如下:
/**
* ================================================
* Email: 2185134304@qq.com
* Created by Novate 2018/11/28 8:51
* Version 1.0
* Params:
* Description: 增删改查方法
* ================================================
*/
public class MainActivity extends AppCompatActivity {
int i = 1;
private DaoSession daoSession;
private UserDao userDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDaoSession() ;
}
private void initDaoSession() {
daoSession = AppApplication.getInstances().getDaoSession();
userDao = AppApplication.getInstances().getDaoSession().getUserDao();
}
/**
* 添加数据
*/
public void add(View view) {
User user = new User(null , "zhangsan" , i , "男") ;
i = i+1;
daoSession.insert(user) ;
List<User> list = userDao.queryBuilder().list();
Log.e("TAG" , "插入成功,查询的结果个数为:"+list.size()+", 数据为:"+list) ;
}
/**
* 删除
*/
public void delete(View view) {
List<User> list = userDao.queryBuilder().list();
if (list == null || list.isEmpty()){
return;
}
for (int j = 0; j < list.size(); j++) {
User user = list.get(j);
if ("zhangsan".equals(user.getName())){
userDao.delete(user);
Log.e("TAG" , "删除姓名为张三的人") ;
}
}
Log.e("TAG" , "删除成功后,查询的结果个数为: "+userDao.queryBuilder().list().size()) ;
}
/**
* 修改
*/
public void update(View view) {
QueryBuilder<User> builder = userDao.queryBuilder();
// 获取年龄为1的 用户的集合
List<User> list = builder.where(UserDao.Properties.Age.eq(1)).list();
if (list == null || list.isEmpty()){
return;
}
for (int j = 0; j < list.size(); j++) {
User user = list.get(j);
user.setName("lisi");
user.setSex("女");
daoSession.update(user);
Log.e("TAG" , "修改成功") ;
}
Log.e("TAG" , "修改成功后,查询的结果个数为: "+userDao.queryBuilder().list().size()) ;
// 查询数据库中所有数据的集合
List<User> list1 = userDao.queryBuilder().list();
if (list1 == null || list1.isEmpty()){
Log.e("TAG" , "所有数据的集合list1 - 暂无数据") ;
return;
}
for (int k = 0; k < list1.size(); k++) {
User user = list1.get(k);
Long id = user.getId();
String name = user.getName();
int age = user.getAge();
String sex = user.getSex();
Log.e("TAG" , "修改后 遍历所有集合的:姓名:"+name+", 年龄:"+age+", 性别:"+sex+", id: "+id) ;
}
}
/**
* 查询
*/
public void query(View view) {
QueryBuilder<User> builder = userDao.queryBuilder();
// 获取 数据库中的list集合
List<User> list = builder.list();
if (list == null || list.isEmpty()){
Log.e("TAG" , "集合中暂无数据") ;
return;
}
for (int j = 0; j < list.size(); j++) {
User user = list.get(j);
Long id = user.getId();
String name = user.getName();
int age = user.getAge();
String sex = user.getSex();
Log.e("TAG" , "查询后 遍历所有集合的:姓名:"+name+", 年龄:"+age+", 性别:"+sex+", id: "+id) ;
}
}
}