前言
GreenDao是一款操作數據庫的神器,經過了2.0版本的升級后,已經被廣泛的開發者使用。確實是很好用,入門簡單,可以剩去了數據庫的建表操作和數據庫SQL的編寫
GreenDao3.2的配置
一、需要在工程(Project)的build.gradle中添加依賴
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
//GreenDao3依賴
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
二、在項目(Module)的build.gradle中添加依賴
apply plugin: 'com.android.application'
//使用greendao
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.zhao.fly"
minSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//greendao配置
greendao {
//版本號,升級時可配置
schemaVersion 1
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//greendao依賴
compile 'org.greenrobot:greendao:3.2.2'
}
到這里就配置成功了
GreenDao3.2的使用
一、創建Bean對象(表名和字段名)
GreenDao需要創建Bean對象之后,該Bean對象就是表名,而它的屬性值就是字段名,其實現是通過注釋的方式來實現的,下面是學生的Bean對象(每個Bean對象對應一張表)
@Entity
public class Student {
//不能用int
@Id(autoincrement = true)
private Long id;
//姓名
@NotNull
private String name;
//學號
@Unique
private String number;
//性別
private int sex;
}
這里需要注意的是,創建完成之后,需要build gradle來完成我們的代碼自動生成。自動生成的代碼有:
1.Bean實體的構造方法和get、set方法
2.DaoMaster、DaoSession、DAOS類
這里對Bean對象的注釋進行解釋:
@Entity:告訴GreenDao該對象為實體,只有被@Entity注釋的Bean類才能被dao類操作
@Id:對象的Id,使用Long類型作為EntityId,否則會報錯。(autoincrement = true)表示主鍵會自增,如果false就會使用舊值
@Property:可以自定義字段名,注意外鍵不能使用該屬性
@NotNull:屬性不能為空
@Transient:使用該注釋的屬性不會被存入數據庫的字段中
@Unique:該屬性值必須在數據庫中是唯一值
@Generated:編譯后自動生成的構造函數、方法等的注釋,提示構造函數、方法等不能被修改
二、創建數據庫(數據庫名)
先定義一個DaoManager類以此方便對數據庫進行一系列的操作
public class DaoManager {
private static final String DB_NAME = "student.db";//數據庫名稱
private volatile static DaoManager mDaoManager;//多線程訪問
private static DaoMaster.DevOpenHelper mHelper;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private Context context;
/**
* 使用單例模式獲得操作數據庫的對象
*/
public static DaoManager getInstance() {
DaoManager instance = null;
if (mDaoManager == null) {
synchronized (DaoManager.class) {
if (instance == null) {
instance = new DaoManager();
mDaoManager = instance;
}
}
}
return mDaoManager;
}
/**
* 初始化Context對象
*/
public void init(Context context) {
this.context = context;
}
/**
* 判斷數據庫是否存在,如果不存在則創建
*/
public DaoMaster getDaoMaster() {
if (null == mDaoMaster) {
mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
}
return mDaoMaster;
}
/**
* 完成對數據庫的增刪查找
*/
public DaoSession getDaoSession() {
if (null == mDaoSession) {
if (null == mDaoMaster) {
mDaoMaster = getDaoMaster();
}
mDaoSession = mDaoMaster.newSession();
}
return mDaoSession;
}
/**
* 設置debug模式開啟或關閉,默認關閉
*/
public void setDebug(boolean flag) {
QueryBuilder.LOG_SQL = flag;
QueryBuilder.LOG_VALUES = flag;
}
/**
* 關閉數據庫
*/
public void closeDataBase() {
closeHelper();
closeDaoSession();
}
public void closeDaoSession() {
if (null != mDaoSession) {
mDaoSession.clear();
mDaoSession = null;
}
}
public void closeHelper() {
if (mHelper != null) {
mHelper.close();
mHelper = null;
}
}
}
說明:這里主要是通過單列模式創建DaoManager,DaoMaster,DaoSession對象,進行初始化以及關閉數據庫操作。
三、數據庫的增刪改查
這里Student的增刪查改封裝在Utils中,其具體代碼如下所示
public class StudentDaoUtil {
private static final boolean DUBUG = true;
private DaoManager manager;
private StudentDao studentDao;
private DaoSession daoSession;
public StudentDaoUtil(Context context) {
manager = DaoManager.getInstance();
manager.init(context);
daoSession = manager.getDaoSession();
manager.setDebug(DUBUG);
}
/**
* 添加數據,如果有重復則覆蓋
*/
public void insertStudent(Student student) {
manager.getDaoSession().insertOrReplace(student);
}
/**
* 添加多條數據,需要開辟新的線程
*/
public void insertMultStudent(final List<Student> students) {
manager.getDaoSession().runInTx(new Runnable() {
@Override
public void run() {
for (Student student : students) {
manager.getDaoSession().insertOrReplace(student);
}
}
});
}
/**
* 刪除數據
*/
public void deleteStudent(Student student) {
manager.getDaoSession().delete(student);
}
/**
* 刪除全部數據
*/
public void deleteAll(Class cls) {
manager.getDaoSession().deleteAll(cls);
}
/**
* 更新數據
*/
public void updateStudent(Student student) {
manager.getDaoSession().update(student);
}
/**
* 按照主鍵返回單條數據
*/
public Student listOneStudent(long key) {
return manager.getDaoSession().load(Student.class, key);
}
/**
* 根據指定條件查詢數據
*/
public List<Student> queryStudent() {
//查詢構建器
QueryBuilder<Student> builder = manager.getDaoSession().queryBuilder(Student.class);
List<Student> list = builder.where(StudentDao.Properties.Sex.ge(1)).where(StudentDao.Properties.Name.like("王小二")).list();
return list;
}
/**
* 查詢全部數據
*/
public List<Student> queryAll() {
return manager.getDaoSession().loadAll(Student.class);
}
}
效果很明顯,GreenDao的封裝更加短小精悍,語義明朗,下面對GreenDao中Dao對象其他API的介紹
查詢附加單個條件
.where()
.whereOr()
查詢附加多個條件
.where(, , ,)
.whereOr(, , ,)
查詢附加排序
.orderDesc()
.orderAsc()
查詢限制當頁個數
.limit()
查詢總個數
.count()
結語
關于GreenDao的的基本概念與基本操作就講到這里,更多對于GreenDao的數據庫操作還需要多多從實戰中去探索,這里只是一個快速入門的引導.GreenDao高級操作還包括有:多表查詢、多表關聯、session緩存等用法,可以到GreenDao的官網進行學習