之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的差异。只停留在会使用的阶段。说起来也是惭愧。本文的重点也是在于如何快速使用。不会进行较深的探究。
介绍:对象关系映射的数据库(ORM)
GreenDAO
说了他的优点,那么我们来看下如何使用。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
...
在App中的build.gradle添加如下:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
...//省略
}
dependencies {
...//省略
compile 'org.greenrobot:greendao:3.2.0'
}
@ToOne:定义与另一个实体(一个实体对象)的关系 @ToMany:定义与多个实体对象的关系 这里只是取出一些具有代表性的注解,想了解更多请查看上面官方文档地址
在了解了基本的注解后我们来看下如何具体使用:
@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
private String sex;
}
创建完成后需要Rebuild Project,之后User会变成:
@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
private String sex;
public User(String name, int age, String sex) {//自己添加的构造方法,并非GreenDAO生成的
this.name = name;
this.age = age;
this.sex = 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;
}
}
同时会生成3个类:
图片.png
UserDao:我们的增删改查都是通过他来完成的。 DaoSession:用来注册UserDao,提供创建UserDao的方法 DaoMaster:主要是用来创建DaoSession和一些更新,创建,删除表的一些炒作 里面的源码不多,有兴趣的可以看下。 剩下的我们就来具体看下我们和进行输出操作:
public class DBManager {
public static DBManager instance;
private DaoMaster.DevOpenHelper mOpenHelper = null;
private static final String DB_NAME = "test_db";
private Context context;
private DBManager(Context context) {
this.context = context;
}
public static DBManager getInstance(Context context) {
if (instance == null) {
synchronized (DBManager.class) {
if (instance == null) {
instance = new DBManager(context);
}
}
}
return instance;
}
public SQLiteDatabase getReadableDatabase() {
if (mOpenHelper == null) {
mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
}
return mOpenHelper.getReadableDatabase();
}
public SQLiteDatabase getWritableDatabase() {
if (mOpenHelper == null) {
mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
}
return mOpenHelper.getWritableDatabase();
}
//保存一个User
public void saveUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.save(user);//与userDao.insert()大致相同区别在于如果不存在就插入,存在就Update修改
}
//保存User集合
public void saveUserOrList(List<User> users) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.saveInTx(users);
}
//保存多个User
public void saveUserOrUsers(User... users) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.saveInTx(users);
}
public void deleteUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.delete(user);
}
public void deleteUserById(Long id) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.deleteByKey(id);
}
public void updateUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.update(user);
}
public List<User> queryBySex(String sex) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
List<User> users = queryBuilder.where(UserDao.Properties.Sex.eq(sex)).list();
return users;
}
public List<User> query() {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
List<User> users = userDao.queryBuilder().build().list();
return users;
}
public List<User> queryByAge(int age) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
List<User> users = queryBuilder.offset(1)
.limit(3)
.orderAsc(UserDao.Properties.Age)
.where(UserDao.Properties.Age.eq(age))
.build()
.list();
return users;
}
public void updateDatabase(int version) {
mOpenHelper.onUpgrade(getWritableDatabase(), 1, version);
}
}
需要注意的是在升级数据库的时候回将原来的数据删除,可能会造成丢失推荐学习文章
GreenDAO的大部分操作都有这里。对于更高级的用法还需要大家自己去学习和探索,毕竟本文的核心和题目一样,快速入门。 为了方便学习推荐一篇文章greenDAO 3.2 初探或者查阅官网地址