前言
之前在自己做項(xiàng)目的時(shí)候,用到了GreenDAO數(shù)據(jù)庫,其實(shí)對(duì)于數(shù)據(jù)庫輔助工具庫從OrmLite,到litePal再到GreenDAO,總是在不停的切換,但是沒有真正去了解他們的差異。只停留在會(huì)使用的階段。說起來也是慚愧。本文的重點(diǎn)也是在于如何快速使用。不會(huì)進(jìn)行較深的探究。
GreenDAO:
介紹:對(duì)象關(guān)系映射的數(shù)據(jù)庫(ORM)

GreenDAO
官網(wǎng)地址
- 優(yōu)點(diǎn)
- 性能高,號(hào)稱Android最快的關(guān)系型數(shù)據(jù)庫
- 內(nèi)存占用小
- 庫文件小,編譯時(shí)間短
- 支持?jǐn)?shù)據(jù)庫加密
- API簡介易用
說了他的優(yōu)點(diǎn),那么我們來看下如何使用。
- 導(dǎo)入
首先在Project下的build.gradle中添加如下:
// 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'
}
- 注解
實(shí)體@Entity注解
- schema:告知GreenDao當(dāng)前實(shí)體屬于哪個(gè)schema
- active:標(biāo)記一個(gè)實(shí)體處于活動(dòng)狀態(tài),活動(dòng)實(shí)體有更新、刪除和刷新方法
- nameInDb:在數(shù)據(jù)中使用的別名,默認(rèn)使用的是實(shí)體的類名
- indexes:定義索引,可以跨越多個(gè)列
- createInDb:標(biāo)記創(chuàng)建數(shù)據(jù)庫表
基礎(chǔ)屬性注解
- @Id :主鍵 Long型,可以通過@Id(autoincrement = true)設(shè)置自增長
- @Property:設(shè)置一個(gè)非默認(rèn)關(guān)系映射所對(duì)應(yīng)的列名,默認(rèn)是的使用字段名 舉例:@Property (nameInDb="name")
- @NotNul:設(shè)置數(shù)據(jù)庫表當(dāng)前列不能為空
- @Transient :添加次標(biāo)記之后不會(huì)生成數(shù)據(jù)庫表的列
索引注解
- @Index:使用@Index作為一個(gè)屬性來創(chuàng)建一個(gè)索引,通過name設(shè)置索引別名,也可以通過unique給索引添加約束
- @Unique:向數(shù)據(jù)庫列添加了一個(gè)唯一的約束
關(guān)系注解
@ToOne:定義與另一個(gè)實(shí)體(一個(gè)實(shí)體對(duì)象)的關(guān)系
@ToMany:定義與多個(gè)實(shí)體對(duì)象的關(guān)系
這里只是取出一些具有代表性的注解,想了解更多請(qǐng)查看上面官方文檔地址
在了解了基本的注解后我們來看下如何具體使用:
- 首先創(chuàng)建的我們的實(shí)體類
@Entity
public class User {
@Id
private Long id;
private String name;
private int age;
private String sex;
}
創(chuàng)建完成后需要Rebuild Project,之后User會(huì)變成:
@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) {//自己添加的構(gòu)造方法,并非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;
}
}
同時(shí)會(huì)生成3個(gè)類:

圖片.png
UserDao:我們的增刪改查都是通過他來完成的。
DaoSession:用來注冊(cè)UserDao,提供創(chuàng)建UserDao的方法
DaoMaster:主要是用來創(chuàng)建DaoSession和一些更新,創(chuàng)建,刪除表的一些炒作
里面的源碼不多,有興趣的可以看下。
剩下的我們就來具體看下我們和進(jìn)行輸出操作:
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();
}
//保存一個(gè)User
public void saveUser(User user) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.save(user);//與userDao.insert()大致相同區(qū)別在于如果不存在就插入,存在就Update修改
}
//保存User集合
public void saveUserOrList(List<User> users) {
DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
DaoSession session = daoMaster.newSession();
UserDao userDao = session.getUserDao();
userDao.saveInTx(users);
}
//保存多個(gè)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);
}
}
需要注意的是在升級(jí)數(shù)據(jù)庫的時(shí)候回將原來的數(shù)據(jù)刪除,可能會(huì)造成丟失推薦學(xué)習(xí)文章
GreenDAO的大部分操作都有這里。對(duì)于更高級(jí)的用法還需要大家自己去學(xué)習(xí)和探索,畢竟本文的核心和題目一樣,快速入門。
為了方便學(xué)習(xí)推薦一篇文章greenDAO 3.2 初探或者查閱官網(wǎng)地址