greenDAO3基本使用
greenDAO3開始使用注解的方式定義實體類(entity),並且是通過安裝gradle插件來生成代碼。之前的版本則是通過建立一個獨立的Java-lib工程來存放生成的文件。
導入相關的包
總工程下加入
dependencies
{
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
//加上以下兩行,引入greendao 3.0
compile 'org.greenrobot:greendao:3.0.1'
compile 'org.greenrobot:greendao-generator:3.0.0'
}
配置gradle
這一步非常關鍵,這是整個grennDAO3改變的核心所在了。
同樣也是在總的工程目錄下添加以下
apply plugin: 'org.greenrobot.greendao'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
在gradle的根模塊中加入上述代碼后,sync project的時候,gradle會自動去maven倉庫下載一個gradle的插件,當然了,這個插件就是為greenDAO服務的,用來生成數據庫相關的代碼。
下載起來會比較慢(網絡不好),由於了這個插件,就不用再去新建一個java-lib去存放一些所生成的文件了,非常方便。
簡單的介紹下通過gradle插件生成數據庫代碼的步驟:每次在make project之前,它會掃描項目中所有的@Entity文件(greenDAO中數據庫的實體類),根據實體類生成DaoSession、DaoMaster以及所有實體類的dao類,生成的文件默認目錄為:build/generated/source/greendao,當然也可以自行修改。
若不想修改生成的路徑,可以將此路徑設置為資源目錄。我們也可以自定義這個路徑,下面就來介紹如何在gradle中配置greenDAO的相關屬性:
修改路徑的方法:
在總的工程目錄下添加以下代碼:
greendao {
//指定數據庫schema版本號,遷移等操作會用到
schemaVersion 1
//DaoSession、DaoMaster以及所有實體類的dao生成的目錄,默認為你的entity所在的包名
//daoPackage 包名
daoPackage 'com.greendaodemo.greendao.gen'
//這就是我們上面說到的自定義生成數據庫文件的目錄了,可以將生成的文件放到我們的java目錄中,而不是build中,這樣就不用額外的設置資源目錄了
//工程路徑
targetGenDir 'src/main/java'
}
所以最后代碼生成的位置是 src/main/java/greendaodemo/greendao/gen
有以下參數可以選擇
schemaVersion:數據庫架構的當前版本。這是使用的 * OpenHelpers類模式版本之間遷移。如果你改變你的實體/數據庫架構,這個值必須增加。默認為1。
daoPackage:用於生成的DAO,DaoMaster和DaoSession包名稱。 默認為源實體的包名。
targetGenDir:其中,生成源應保存在該位置。 默認為構建目錄里面生成的源文件夾( build / generated / source / greendao )。
generateTests: 設置為true,自動生成單元測試。
targetGenDirTests: 在哪里產生的單元測試應該被存儲在基本目錄。默認為 SRC / androidTest / java的。
編寫entity類
//@Entity 將我們的java普通類變為一個能夠被greenDAO識別的數據庫類型的實體類
@Entity
public class User {
//@Id:通過這個注解標記的字段必須是Long類型的,這個字段在數據庫中表示它就是主鍵,並且它默認就是自增的
@Id
private Long id;
private String name; //普通字段
//@Transient:表明這個字段不會被寫入數據庫,只是作為一個普通的java類字段,用來臨時存儲數據的,不會被持久化
@Transient
private int tempUsageCount; // not persisted
}
編譯一下(Build->Make Project)
make完成之后會發現我們的User類中突然多了好多代碼,這就是greenDAO自動為你生成的代碼。這時就會多了get、set方法,以及構造函數(無參、有參),同時發現src/main/java/greendaodemo/greendao/gen下多了DaoSession、DaoMaster以及所有實體類的dao,之后所有相關的數據庫操作都依靠這三個文件了。
@Id注解選擇 long / Long 屬性作為實體ID。在數據庫術語中,它是主鍵。參數自動增量,是使ID值不斷增加(不會選用舊值)的標志。
@Property讓你定義一個非默認的列名,其屬性映射到。如果不存在,greenDAO將在SQL雜交方式使用字段名(大寫,下划線,而不是駱駝情況下,例如 customName將成為 CUSTOM_NAME)。注意:您目前只能使用內聯常量來指定列名。
@NotNull makes the property a “NOT NULL” column on the database side。通常是有意義的紀念原始類型(long, int, short, byte)與@NotNull,同時具有包裝類(Long, Integer, Short, Byte)空的值。
@Transient表明這個字段不會被寫入數據庫,只是作為一個普通的java類字段,用來臨時存儲數據的,不會被持久化
@Entity 定義實體
@nameInDb 在數據庫中的名字,如不寫則為實體中類名
@indexes 索引
@createInDb 是否創建表,默認為true,false時不創建
@schema 指定架構名稱為實體
@active 無論是更新生成都刷新
@Id
@NotNull 不為null
@Unique 唯一約束
@ToMany 一對多
@OrderBy 排序
@ToOne 一對一
@Transient 不存儲在數據庫中
@generated 由greendao產生的構造函數或方法
數據庫側的表和列名稱派生自實體和屬性名稱。 而不是在Java中使用的駱駝案例樣式,默認數據庫名稱使用大寫,使用下划線分隔單詞。
例如name在數據庫中顯示NAME,creationDate 顯示CREATION_DATE
用法(增刪改查操作)
1.初始化數據庫
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "user-db", null);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
DaoSession daoSession = daoMaster.newSession();
UserDao userDao = daoSession.getUserDao();
1. user-db是數據庫名字(可以修改成別的,因為本來就不存在),應為我們之前創建了一個Entity叫做User,所以greenDAO自定幫我們生成的UserDao,拿到了這個UserDao,我們就可以操作User這張表了。
2. 一個DaoMaster就代表着一個數據庫的連接;DaoSession可以讓我們使用一些Entity的基本操作和獲取Dao操作類,DaoSession可以創建多個,每一個都是屬於同一個數據庫連接的。
DaoMaster:使用greenDAO的切入點。 DaoMaster保存數據庫對象(SQLiteDatabase)並管理特定模式的DAO類(而不是對象)。它有靜態方法來創建表或刪除它們。它的內部類OpenHelper和DevOpenHelper是SQLiteOpenHelper實現,在SQLite數據庫中創建模式。
DaoSession:管理特定模式的所有可用DAO對象,您可以使用其中一個getter方法獲取。 DaoSession還為實體提供了一些通用的持久性方法,如插入,加載,更新,刷新和刪除。最后,DaoSession對象也跟蹤標識范圍。
DAO:數據訪問對象(DAO)持續並查詢實體。對於每個實體,greenDAO生成DAO。它具有比DaoSession更多的持久化方法,例如:count,loadAll和insertInTx。
實體:持久對象。通常,實體是使用標准Java屬性(如POJO或JavaBean)表示數據庫行的對象。
2.插入數據
操作都是基於對象的了
//新建一個對象
User user = new User(null, "001");
//插入
userDao.insert(user);
3.查找數據
List<User> userList = userDao.queryBuilder()
.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Id)
.limit(5)
.build().list();
queryBuilder()方法,生成一個查找構造器,可以給構造器添加where條件判斷、按照某某字段排序以及查詢的條數等基本的數據庫操作。list()方法表示查詢的結果為一個集合.上述代碼查詢的就是ID號不等於999,按升序排序,做多5條,返回List類型
list()所有實體被加載到內存中。其結果通常是一個 ArrayList中,最容易使用。
listLazy()實體被裝入點播存儲器。一旦列表中的一個元素被首次訪問,它被加載並高速緩存以供將來使用。必須關閉。
listLazyUncached()一個“虛擬”實體名單:任何接觸到從數據庫加載其數據的列表元素的結果。必須關閉。
ListIterator()通過懶加載的數據讓你通過迭代的結果的。數據不會被緩存。必須關閉
方法 listLazy (), listLazyUncached (),和 的ListIterator ()利用greenDAO的的LazyList類。要加載按需數據,它保存到數據庫游標的引用。這是你必須確保關閉惰性列表和迭代器(通常在try / finally塊)的原因。
查找單一個對象
User user = userDao.queryBuilder()
.where(UserDao.Properties.Id.eq(999)).unique();
在多線程執行查詢
如果您在使用多線程查詢,您必須調用 forCurrentThread ()得到一個Query實例當前線程。
原始查詢
如果QueryBuilder的不提供你所需要的,有執行原始SQL仍返回實體對象的兩種方法。
第一,優選的方法是使用的QueryBuilder和 WhereCondition 。StringCondition。
有了這個,你可以傳遞任何SQL片段作為WHERE子句查詢生成器。
例如:
Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)")
).build();
第二種方法是使用 queryRaw或 queryRawCreate方法。
它們允許你通過原始SQL字符串,這是SELECT和實體列后面。通過這種方式,你可以有任何WHERE和ORDER BY要選擇實體條款。實體表可以被稱為使用別名。
Query query = userDao.queryRawCreate
(", GROUP G WHERE G.NAME=?
AND T.GROUP_ID=G._ID", "admin");
4.修改數據
//1.where是查詢條件,
//2.unique()表示查詢結果為一條數據,若數據不存在,findUser為null。
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();
if(findUser != null) {
findUser.setName(newName);
// update為更新
userDao.update(findUser);
Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MyApplication.getContext(), "用戶不存在", Toast.LENGTH_SHORT).show();
}
5.刪除數據
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();
if(findUser != null){
//通過Key來刪除,這里的Key就是user字段中的ID號
userDao.deleteByKey(findUser.getId());
}