GreenDao

可以先上官網看下對於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;

查看控制檯:

 

github:https://github.com/callmexiaolu/GreenDaoDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章