在本文中我只记录了我认为重要的, 旨在先创建一个简单的demo能把greendao的一些基础的功能用起来, 可能并不详细, 理解可能也有错误, 如果您想看详细而全面的介绍, 请移步官网, 如果您对本文有任何疑问或者建议, 请随时@我
greendao官网:
http://greenrobot.org/greendao
数据库升级:
https://github.com/yuweiguocn/GreenDaoUpgradeHelper
配置build.gradle
project–>build.gradle:
app–>build.gradle:
schemaVersion: 数据库版本号
daoPackage: 在指明的gen目录下自己定义生成的dao等文件的存放位置
targetGenDir: 指明gen目录
使用
在application中初始化, 避免重复创建DaoSession对象
public class MyApp extends Application {
private static MyApp myApp;
private DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
myApp = this;
initDao();
}
private void initDao() {
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以在正式的项目中,应该做一层封装,来实现数据库的安全升级,
// 创建MySQLiteOpenHelper类继承DaoMaster.OpenHelper, 重写onUpgrade方法来实现安全升级
MigrationHelper.DEBUG = true; //如果你想查看日志信息,请将DEBUG设置为true
MySQLiteOpenHelper mHelper = new MySQLiteOpenHelper(this, "db_test", null);
DaoMaster mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
daoSession = mDaoMaster.newSession();
}
public static MyApp getInstance(){
return myApp;
}
public DaoSession getDaoSession() {
return daoSession;
}
}
MySQLiteOpenHelper类:
public class MySQLiteOpenHelper extends OpenHelper {
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
public MySQLiteOpenHelper(Context context, String name) {
super(context, name);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
MigrationHelper.migrate(db,UserDao.class, PersonalDao.class);
}
}
实体
@Entity
public class User {
// 主键,autoincrement设置自增
@Id(autoincrement = true)
protected Long id;
// 列名,默认使用变量名。默认变化举例:userName --> USER_NAME
// @Property(nameInDb = "USERNAME")
// 非空
@NotNull
protected String userName;
// 忽略,不持久化(即不写入数据库),可用关键字transient替代
// @Transient
protected String pwd;
// 索引,unique设置唯一,name设置索引别名
@Index(unique = true)
protected long userCardId;
@ToOne(joinProperty = "userCardId")
protected Phone phone;
@ToMany(referencedJoinProperty = "userId")
private List<Son> sons;
}
@Entity
public class Phone {
@Id(autoincrement = true)
private Long id;
private long phoneId;
private double price;
}
@Entity
public class Son {
@Id(autoincrement = true)
private Long id;
private long userId;
@NonNull
private String sonName;
@Unique
private long sonCardId;
}
关于实体类定义有以下几点要说:
1. 注意注解标签的使用, 特别是ToOne和ToMany的使用;
2. 如果id定义为自增长, 那么id不需要传递, 可以自定义构造方法;
插入一条数据举例:
daoSession = MyApp.getInstance().getDaoSession();
phoneDao = daoSession.getPhoneDao();
Phone phone = new Phone(123, 2000.00);
phoneDao.insert(phone);
如果是插入一组数据:
List<Son> sonList = new ArrayList<>();
Son son1 = new Son("女儿"+index, 20001010L+index);
son1.setUserId(user.getId());
Son son2 = new Son("儿子"+index, 30001010L+index);
son2.setUserId(user.getId());
sonList.add(son1);
sonList.add(son2);
sonDao.insertInTx(sonList);
所有的curd方法都可在Dao对象中找到
常用方法:
insert/insertInTx/insertOrReplace/insertOrReplaceInTx
delete/deleteByKey/deleteAll
update/updateInTx
load/loadByRowId/loadAll
查询举例:
List users = userDao.queryBuilder() // 查询 User
.where(Properties.FirstName.eq("pan")) // first那么等于pan
.orderAsc(Properties.LastName) // lastName升序排列
.list();
当然不止where和orderASC, 还有很多API, 比如limit/orderDesc/and/or等等
关于ToOne和ToMany的使用
官方关于ToOne和ToMany的介绍:
http://greenrobot.org/greendao/documentation/relations/
当我make project后, 发现在User类中没有setSons(List sons)这样的方法, 我当时很疑问, 如果没有set方法, 我的sonList应该如何放入user对象中并插入数据库, 最后我看了下User类中greendao自动生成的setPhone(@NotNull Phone phone)/getPhone()/getSons()这三个方法, 我突然明白应该怎么用了, 就是User类并不负责ToOne和ToMany修饰的对象的存储工作, 每个对象应该自己负责自己的存储工作, 而不是交给其他人, 就算是setPhone方法, 其也只是需要拿到phone对象的id而已, 这是一开始的逻辑惯性导致思维误区, 举例说明:
Phone phone = new Phone(123, 2000.00);
phoneDao.insert(phone);
user = new User("userName"+index, "pwd"+index, 10001010L+index);
// 存储之前调用setPhone方法把phone表和user表关联起来,
// 如果不调用, user.getPhone()获取的只会是空值
user.setPhone(phone);
userDao.insert(user);
List<Son> sonList = new ArrayList<>();
Son son1 = new Son("女儿"+index, 20001010L+index);
// setUserId方法的调用把son表和user表关联起来, 如果son在存储之前不调用这个方法来传入正确的数据,
// 那么我们在调用user.getSons()方法获取的只会是一个空值
son1.setUserId(user.getId());
Son son2 = new Son("儿子"+index, 30001010L+index);
son2.setUserId(user.getId());
sonList.add(son1);
sonList.add(son2);
sonDao.insertInTx(sonList);//自己的存储工作自己负责
数据库升级
如果我们为entity增减了成员变量, 意味着我们需要升级数据库, 不然项目运行会报错, 修改entity后make project, 修改gradle中schemaVersion的值比之前的大, 再运行就不会出错了, 意味着升级成功