可以先上官網看下對於GreenDao的介紹,以及爲什麼使用greendao。
Introduction
greenDAO is an object/relational mapping (ORM) tool for Android. It offers an object oriented interface to the relational database SQLite. ORM tools like greenDAO do many repetitive tasks for you and offer a simple interface to your data.
greenDAO是Android的對象/關係映射(ORM)工具。它爲關係數據庫SQLite提供了面向對象的接口。像greenDAO這樣的ORM工具可以爲您完成許多重複性任務,併爲您的數據提供簡單的界面。
並且目前greendao是android ORM(對象關係映射)框架中速度最快,效率最高的一個數據庫操作框架。
配置:官方教程配置
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.2.2' // add library
}
另外最好在app的build.gradle中加入數據庫版本,另外一些參數也可按照自己喜好編輯。
// In the build.gradle file of your app project:
android {
...
}
greendao{
schemaVersion 2 //數據庫版本號
// daoPackage //生成的DAO,DaoMaster和DaoSession的包名稱。默認爲源實體的包名稱。
//targetGenDir //生成DaoMaster,DaoSession,Dao的目錄路徑。默認爲構建目錄(build / generated / source / greendao)中生成的源文件夾。
// generateTests //設置爲true以自動生成單元測試
//targetGenDirTests //生成單元測試存儲的基本目錄。默認爲src / androidTest / java。
}
這樣子就配置完了GreenDao了。
體驗:
新建一個實體類
@Entity
public class User {
@Id
private Long id;
private String name;
@Transient
private int tempUsageCount; // not persisted
// getters and setters for id and user ...
}
關於註解的解釋:
Entity註釋將Java類標記爲greenDAO的可預設實體。即生成數據庫中的一個表
Id註釋選擇long / Long屬性作爲實體ID。在數據庫方面,它是主鍵。參數autoincrement是一個標誌,用於使ID值不斷增加(不重用舊值)。
@Property
設置一個非默認關係映射所對應的列名,默認是使用字段名,例如:@Property(nameInDb = “userName”)
@NotNull
設置數據庫表當前列不能爲空
@Transient
添加此標記後不會生成數據庫表的列
@Unique
表名該屬性在數據庫中只能有唯一值
@ToMany
定義一對多個實體對象的關係
@ToOne
表示一對一關係
@OrderBy
更加某一字段排序 ,例如:@OrderBy(“date ASC”)
然後make project。默認生成的目錄在
生成了DaoMaster,DaoSession,UserDao這三個類。
DaoMaster:使用greenDAO的切入點。 DaoMaster保存數據庫對象(SQLiteDatabase)並管理特定模式的DAO類(而不是對象)。它有靜態方法來創建表或刪除它們。它的內部類OpenHelper和DevOpenHelper是SQLiteOpenHelper實現,它們在SQLite數據庫中創建模式
DaoSession:管理特定模式的所有可用DAO對象,您可以使用其中一個getter方法獲取該對象。 DaoSession還提供了一些通用的持久性方法,如實體的插入,加載,更新,刷新和刪除。最後,DaoSession對象還跟蹤身份範圍。
DAO:數據訪問對象(DAO)持久存在並查詢實體。對於每個實體,greenDAO生成DAO。它具有比DaoSession更多的持久性方法
private DaoMaster master;
private DaoSession daoSession;
private SQLiteDatabase db;
private UserDao userDao;
db = new DaoMaster.DevOpenHelper(MainActivity.this,"test.db",null).getWritableDatabase();
master = new DaoMaster(db);
daoSession = master.newSession();
userDao = daoSession.getUserDao();
//看生成的代碼可以發現,DevOpenHelper繼承了DatabaseOpenHelper,所以可以使用getWritableDataase
所以應該先通過DaoMaster的DevOpenHelper方法來創建一個數據庫,然後再獲得一個db,通過新建一個DaoMaster,獲得master,再通過master new一個Daosession,接着通過session get到一個可操作數據庫的實體類dao。
插入數據:
User user = new User();
user.setName("sss");
user.setAge(15);
userDao.insert(user);
查詢數據
使用greendao的查詢
List<User> userList = userDao.queryBuilder().list();
for (User user:userList) {
Log.d("user","query all "+ user.getName());
}
- list() All entities are loaded into memory. The result is typically an ArrayList with no magic involved. Easiest to use.
- listLazy() Entities are loaded into memory on-demand. Once an element in the list is accessed for the first time, it is loaded and cached for future use. Must be closed.
- listLazyUncached() A “virtual” list of entities: any access to a list element results in loading its data from the database. Must be closed.
- listIterator() Let’s you iterate through results by loading the data on-demand (lazily). Data is not cached. Must be closed.
list()將所有實體加載到內存中。結果通常是一個沒有魔法的ArrayList。最容易使用。
如果是一對一,一對多,多對多的關係,那麼該方法會把相對應的表的對象也會加載進內存,不是很好。
例如一個son表和father表,一個son對應一個father(son中有father的外鍵),對son使用該方法,會把father也加載金內存。
listLazy()實體按需加載到內存中。首次訪問列表中的元素後,將加載並緩存該元素以供將來使用。必須關閉。
這個按需是你需要訪問哪個數據就會加載哪個數據(延時加載),該方法就避免了list方法的缺點,提高了應用的性能。
使用該方法必須關閉。
LazyList<Son> sonList = sonDao.queryBuilder().listLazy();
for (Son son:sonList) {
Log.d("son","query all "+ son.toString());
}
sonList.close();
關閉方法的原理我們查看源碼可以得知,是使用了遊標的關閉。
public void close() {
cursor.close();
}
listLazyUncached()實體的“虛擬”列表:對列表元素的任何訪問都會導致從數據庫加載其數據。必須關閉。
listIterator()讓我們通過按需加載數據(懶惰)來迭代結果。數據未緩存。必須關閉。
Iterator sonList = sonDao.queryBuilder().listIterator();
while (sonList.hasNext()) {
Son son = (Son) sonList.next();
Log.d("son","query all "+ son.getName());
}
有關更過的查詢方法和使用可以前往官網看文檔。
http://greenrobot.org/greendao/documentation/queries/
我們還可以在控制檯看進行該查詢的時候所對應的SQL語句是怎樣。
只需要加入這個就行。
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
查看控制檯: