文章来源:GreenDao:3.2.0用法
目录
一、使用GreenDao的流程
- 添加GreenDao依赖
- 配置greendao的generator生成文件
- 使用GreenDao生成bean类
3.1 创建实体类
3.2 生成dao文件 - 创建GreenDaoManager来进行统一管理,并初始化
4.1 创建GreenDaoManager
4.2 在Application中进行初始化GreenDao - 使用GreenDao来进行数据操作CRUD
二、GreenDao升级
三、GreenDao注释
一、使用GreenDao的流程
1.添加GreenDao依赖
// 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
}
2. 配置greendao的generator生成文件
// In your app projects build.gradle file:
android {
//...
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.db.greendao.gen' //自动生成的工具类的包名,一般为app包名+生成文件的文件夹名
targetGenDir 'src/main/java' //生成文件路径
}
//...
}
3. 使用GreenDao生成bean类
3.1 创建实体类
@Entity
public class Person {
@Id
private Long id;
private String name;
private int age;
private String sex;
}
3.2 生成dao文件
按ctrl+F9,或者在工具栏build下面的Make Project对项目进行重新构建。
生成文件。
而Person类变样了
变成了
package gap.com.mydemo;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
/**
* @version $version$
* @package $package$
* @description $desc$
* @user gzl
* @date $date$
* @time $time$
* @email 973780371@qq.com
* @phone 18067970513
*/
@Entity
public class Person {
@Id
private Long id;
private String name;
private int age;
private String sex;
@Generated(hash = 2139037974)
public Person(Long id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
@Generated(hash = 1024547259)
public Person() {
}
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;
}
}
targetGenDir 'src/main/java' //生成文件路径 就是用于指定经过处理的Person类放置的位置。
4. 创建GreenDaoManager来进行统一管理,并初始化
4.1 创建GreenDaoManager
初始化需要实例化GreenDao所需要的几个关键对象,DaoMaster,DaoSession。
创建GreenDaoManager类,在构造函数中进行初始化**
public class GreenDaoManager {
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private static volatile GreenDaoManager mInstance = null;
private GreenDaoManager(Context context) {
if (mInstance == null) {
DaoMaster.DevOpenHelper devOpenHelper = new
DaoMaster.DevOpenHelper(context, "message.db"); //数据库名
mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
}
}
public static GreenDaoManager getInstance() {
return mInstance;
}
public static void initGreenDaoManager(Context context) {
if (mInstance == null) {
synchronized (GreenDaoManager.class) {
if (mInstance == null) {
mInstance = new GreenDaoManager(context);
}
}
}
}
public DaoMaster getMaster() {
return mDaoMaster;
}
public DaoSession getSession() {
return mDaoSession;
}
public DaoSession getNewSession() {
mDaoSession = mDaoMaster.newSession();
return mDaoSession;
}
}
4.2 在Application中进行初始化GreenDao
GreenDaoManager.initGreenDaoManager(this);
5. 使用GreenDao来进行数据操作CRUD
首先封装一个方法,方便后面的CRUD操作。
private PersonDao getPersonDao() {
return GreenDaoManager.getInstance().getSession().getPersonDao();
}
CRUD方法参考下面:
public class MainActivity extends AppCompatActivity {
//@Transient,该注解表示这个属性将不会作为数据表中的一个字段
//@NotNull表示该字段不可以为空,@Unique表示该字段唯一
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// updatadata();
// insertdata();
// querydata();
//删除数据
// getUserDao().deleteByKey(2l);//long类型
// querydata();
// querydataBy();
getuserById();
}
private void getuserById() {
User user =getUserDao().load(1l);
Log.i("tag", "结果:" + user.getId() + "," + user.getName() + "," + user.getAge() + "," + user.getIsBoy() + ";");
}
private void insertdata() {
//插入数据
User insertData = new User(null, "插入数据", 24, false);
getUserDao().insert(insertData);
}
private void updatadata() {
//更改数据
List<User> userss = getUserDao().loadAll();
User user = new User(userss.get(0).getId(), "更改后的数据用户", 22, true);
getUserDao().update(user);
}
private void querydata() {
//查询数据详细
List<User> users = getUserDao().loadAll();
Log.i("tag", "当前数量:" + users.size());
for (int i = 0; i < users.size(); i++) {
Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
}
}
private void querydataBy() {////查询条件
Query<User> nQuery = getUserDao().queryBuilder()
// .where(UserDao.Properties.Name.eq("user1"))//.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Age)//.limit(5)//orderDesc
.build();
List<User> users = nQuery.list();
Log.i("tag", "当前数量:" + users.size());
for (int i = 0; i < users.size(); i++) {
Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
}
// QueryBuilder qb = userDao.queryBuilder();
// qb.where(Properties.FirstName.eq("Joe"),
// qb.or(Properties.YearOfBirth.gt(1970),
// qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
// List youngJoes = qb.list();
}
/**
* 根据查询条件,返回数据列表
* @param where 条件
* @param params 参数
* @return 数据列表
*/
public List<User> queryN(String where, String... params){
return getUserDao().queryRaw(where, params);
}
/**
* 根据用户信息,插件或修改信息
* @param user 用户信息
* @return 插件或修改的用户id
*/
public long saveN(User user){
return getUserDao().insertOrReplace(user);
}
/**
* 批量插入或修改用户信息
* @param list 用户信息列表
*/
public void saveNLists(final List<User> list){
if(list == null || list.isEmpty()){
return;
}
getUserDao().getSession().runInTx(new Runnable() {
@Override
public void run() {
for(int i=0; i<list.size(); i++){
User user = list.get(i);
getUserDao().insertOrReplace(user);
}
}
});
}
/**
* 删除所有数据
*/
public void deleteAllNote(){
getUserDao().deleteAll();
}
/**
* 根据用户类,删除信息
* @param user 用户信息类
*/
public void deleteNote(User user){
getUserDao().delete(user);
}
private UserDao getUserDao() {
return GreenDaoManager.getInstance().getSession().getUserDao();
}
}
二、GreenDao升级
第一步:改版本号
greendao{
schemaVersion 5
daoPackage 'xxxxxxxxxx'
targetGenDir 'src/main/java'
}
第二步:修改实体类为自己需要的类型
重现编译项目运行即可。
这样修改,之前的数据库会被删除,重新创建。
三、GreenDao注释
常用注解
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "USERNAME")
private String name;
@NotNull
private int repos;
@Transient
private int tempUsageCount;
...
}
@Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
@Id 标明主键,括号里可以指定是否自增
@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
@NotNull 非空
@Transient 标识这个字段是自定义的不会创建到数据库表里
@Unique 添加唯一约束
关系注解
@Entity
public class Order {
@Id private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@Entity
public class Customer {
@Id private Long id;
}
@ToOne 是将自己的一个属性与另一个表建立关联
@Entity
public class User {
@Id private Long id;
@ToMany(referencedJoinProperty = "ownerId")
private List<Site> ownedSites;
}
@Entity
public class Site {
@Id private Long id;
private long ownerId;
}
// ----------------------------
@Entity
public class User {
@Id private Long id;
@Unique private String authorTag;
@ToMany(joinProperties = {
@JoinProperty(name = "authorTag", referencedName = "ownerTag")
})
private List<Site> ownedSites;
}
@Entity
public class Site {
@Id private Long id;
@NotNull private String ownerTag;
}
@ToMany的属性referencedJoinProperty,类似于外键约束。
@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。
网友评论