轉載務必保留以下資訊:
本文作者:speedy
CSDN 專欄:blog.csdn.net/speedystone
掘金專欄:juejin.im/user/57e082…
一、GreenDao 簡介
greenDAO 是一款開源的面向 Android 的輕便、快捷的 ORM 框架,將 Java 物件對映到 SQLite 資料庫中,我們運算元據庫的時候,不在需要編寫複雜的 SQL語句, 在效能方面,greenDAO 針對 Android 進行了高度優化, 最小的記憶體開銷 、依賴體積小 同時還是支援資料庫加密。
greenDAO 官網地址:greenrobot.org/greendao/
二、GreenDao 特徵:
1、物件對映( ORM)
greenDAO 是ORM 框架,可以非常便捷的將Java 物件對映到 SQLite 資料庫中儲存。
2、高效能
ORM 框架有很多,比較著名的有 OrmLite , ActiveAndroid 等,效能也不一樣,下圖是 GreenDao 官方給出的效能對比。
3、支援加密
GreenDao 是支援加密的,可以安全的儲存使用者資料。
4、輕量級
GreenDao 核心庫小於100k ,所以我們並不會擔心新增 GreenDao 後 APK 大小會變的是否龐大。
5、支援 protocol buffer(protobuf) 協議
GreenDao 支援 protocol buffer(protobuf) 協議資料的直接儲存,如果你通過 protobuf 協議與伺服器互動,將不需要任何的對映。
6,程式碼生成
greenDAO 會根據配置資訊自動生成核心管理類以及 DAO 物件
7,開源
greenDAO 是開源的,我們可以在github 上下載原始碼,學習。github 地址:github.com/greenrobot/…
三、核心類介紹
DaoMaster:
使用 greenDAO 的入口點。DaoMaster 負責管理資料庫物件(SQLiteDatabase)和 DAO 類(物件),我們可以通過它內部類 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 建立不同模式的 SQLite 資料庫。
DaoSession :
管理指定模式下的所有 DAO 物件,DaoSession提供了一些通用的永續性方法比如插入、負載、更新、更新和刪除實體。
XxxDAO :
每個實體類 greenDAO 多會生成一個與之對應DAO物件,如:User 實體,則會生成一個一個UserDao 類
Entities
可持久化物件。通常, 實體物件代表一個資料庫行使用標準 Java 屬性(如一個POJO 或 JavaBean )。
核心類之間的關係
四、 整合 GreenDAO
a、設定倉庫與外掛(Project: build.gradle)
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}複製程式碼
b、 配置依賴 ( Module:app build.gradle )
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
// This is only needed if you want to use encrypted databases
compile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密庫依賴(可選項)
}複製程式碼
c、 配置資料庫相關資訊 ( Module:app build.gradle )
greendao {
schemaVersion 1 //資料庫版本號
daoPackage 'com.speedystone.greendaodemo.db'// 設定DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//設定DaoMaster、DaoSession、Dao目錄
}複製程式碼
d、點選 : Sync Project with Gradle Files 按鈕,同步一下工程 , 配置完成
五、快速入門
1, 我們寫一個簡單的實體類(User),測試一下
package com.speedystone.greendaodemo.model;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
/**
* Created by Speedy on 2017/6/30.
*/
@Entity
public class User {
@Id
private long id;
private String name;
private int age;
//此處省略了getter,setter 方法
}複製程式碼
2、點選 Make Project(或者 Make Moudle 'App') 編譯一下工程 。如果配置正確,會在配置的包目錄下自動會生成 DaoMaster,DaoSession 和 UserDao 類 。
3,初始化 GreenDao ( 通常初始化程式碼寫在我們的 Application 類中)
4,獲取 UserDao
MyApp myApp = (MyApp) getApplication();
DaoSession daoSession = myApp.getDaoSession();
UserDao userDao = daoSession.getUserDao();複製程式碼
5, 儲存記錄
User user = new User();
user.setUserId(1);
user.setName("小明");
user.setAge(16);
userDao.insert(user);複製程式碼
User user = new User();
user.setUserId(1);
user.setName("小明");
user.setAge(16);
//插入或者替換
userDao.insertOrReplace(user);複製程式碼
5, 刪除記錄
public void delete(User user){
userDao.delete(user);
}複製程式碼
或者
public void deleteByUserId(long userid){
userDao.deleteByKey(1L);
}複製程式碼
6,更新記錄
public void update(User user){
userDao.update(user);
}複製程式碼
7,查詢記錄
public List query(){
return userDao.loadAll();// 查詢所有記錄
} 複製程式碼
public User query2(){
return userDao.loadByRowId(1);//根據ID查詢
}複製程式碼
public List query2(){
return userDao.queryRaw("where AGE>?","10");//查詢年齡大於10的使用者
} 複製程式碼
//查詢年齡大於10的使用者
public List query4(){
QueryBuilder builder = userDao.queryBuilder();
return builder.where(UserDao.Properties.Age.gt(10)).build().list();
} 複製程式碼
六、註解詳解
@Entity
表明這個實體類會在資料庫中生成一個與之相對應的表
屬性:
- schema:告知GreenDao當前實體屬於哪個 schema
- schema active:標記一個實體處於活躍狀態,活動實體有更新、刪除和重新整理方法
- nameInDb:在資料庫中使用的別名,預設使用的是實體的類名,
- indexes:定義索引,可以跨越多個列
- createInDb:標記建立資料庫表(預設:true)
- generateConstructors 自動建立全參構造方法(同時會生成一個無參構造方法)(預設:true)
- generateGettersSetters 自動生成 getters and setters 方法(預設:true)
@Entity(
schema = "myschema",
active = true,
nameInDb = "AWESOME_USERS",
indexes = {
@Index(value = "name DESC", unique = true)
},
createInDb = true,
generateConstructors = false,
generateGettersSetters = true
)
public class User {
...
}複製程式碼
@Id
對應資料表中的 Id 欄位
@Index
使用@Index作為一個屬性來建立一個索引,預設是使用欄位名
@Entity
public class User {
@Id
private Long id;
@Index(unique = true)
private String name;
}複製程式碼
@Property
設定一個非預設關係對映所對應的列名,預設是使用欄位名,例如:@Property(nameInDb = "userName")
@NotNull
設定資料庫表當前列不能為空
@Transient
新增此標記後不會生成資料庫表的列
@Unique
表名該屬性在資料庫中只能有唯一值
@Entity
public class User {
@Id
private Long id;
@Unique
private String name;
}複製程式碼
@ToOne
表示一對一關係
@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;
}複製程式碼
@OrderBy
更加某一欄位排序 ,例如:@OrderBy("date ASC")
@ToMany
定義一對多個實體物件的關係
@Entity
public class Customer {
@Id private Long id;
@ToMany(referencedJoinProperty = "customerId")
@OrderBy("date ASC")
private List orders;
}
@Entity
public class Order {
@Id private Long id;
private Date date;
private long customerId;
} 複製程式碼