Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ORM框架 GreenDao3.0的使用

Android ORM框架 GreenDao3.0的使用

編輯:關於Android編程

前言

之前用過許多的Orm框架,例如:ORMLite、greendao、ormndroid、androrm、ActiveAndroid,SugarORM等等,不過都沒有一一研究,感覺GreenDao的文檔和支持率比較高,所以就一直采用了GreenDao作為項目的Orm框架,關於這些框架的大致分析,可以看我Csdn的文章Android Orm框架分析 ,回到正題,我之前用的還是GreenDao的2.x版本,總體感覺來時是比較難用的,而且唯一不能接受的是新建一個Java項目,然後再項目中配置各個實體的字段等相關屬性,然後生成實體以及DAO操作相關的一些類。但是,當你修改了實體中的一些屬性,並且這些屬性又要在數據庫中保存的時候,你會發現每次重新運行generator之前的改變都得重新再來一次。

不過作者新發布的GreenDao3的話用了大量的注解,省去了新建項目的繁瑣,使用起來也更加簡潔明了,我們今天就來講講如何使用GreenDao3

介紹

greenDao是一個將對象映射到SQLite數據庫中的輕量且快速的ORM解決方案。
關於greenDAO的概念可以看官網greenDAO

greenDao優勢

1、一個精簡的庫
2、性能最大化
3、內存開銷最小化
4、易於使用的 APIs
5、對 Android 進行高度優化
6、秒勝當前市面上的其他Orm框架(這個也是看總體水平,也是我為什麼推崇大家用次框架的重要理由,既然要學就要學最要好用的)

GreenDao的使用

首先gradle引入

compile 'org.greenrobot:greendao:3.2.0'//GreenDao

在build.gradle中進行配置:

App:

apply plugin: 'org.greenrobot.greendao'//GreenDao

項目:

buildscript {
    repositories {
        jcenter()

    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'//GreenDao
    }
}

然後再Make Project 你會在build/generated/source/greendao中發現新生成的內容,build/generated/source/greendao是默認路徑,可以去配置的,配置方法在接下來將會講到。

Gradle Plugin的配置:

// In the build.gradle file of your app project:
android {
...
}

greendao {
        schemaVersion 1  
        //daoPackage 'com.greendao.gen'  
        //targetGenDir 'src/main/java'  
}

schemaVersion 當前數據庫結構的版本。結構版本變化時在OpenHelpers中被使用到。當你改變實體或者數據的結構時,這個值應該增加。
daoPackage 生成的DAO,DaoMaster和DaoSession的包名。默認是實體的包名。
targetGenDir 生成源文件的路徑。默認源文件目錄是在build目錄中的(build/generated/source/greendao)。
generateTests 設置是否自動生成單元測試。
targetGenDirTest 生成的單元測試的根目錄。

主要代碼

創建一個Bean文件

代碼如下

實體注解:

@Entity(
        // 如果你有超過一個的數據庫結構,可以通過這個字段來區分
        // 該實體屬於哪個結構
        schema = "myschema",

        //  實體是否激活的標志,激活的實體有更新,刪除和刷新的方法
        active = true,

        // 確定數據庫中表的名稱
        // 表名稱默認是實體類的名稱
        nameInDb = "AWESOME_USERS",

        // Define indexes spanning multiple columns here.
        indexes = {
                @Index(value = "name DESC", unique = true)
        },

        // DAO是否應該創建數據庫表的標志(默認為true)
        // 如果你有多對一的表,將這個字段設置為false
        // 或者你已經在GreenDAO之外創建了表,也將其置為false
        createInDb = false
)
public class User {
  ...
}

基礎注解:

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "USERNAME")
    private String name;

    @NotNull
    private int repos;

    @Transient
    private int tempUsageCount;

    ...
}

1.實體@Entity注解

schema:告知GreenDao當前實體屬於哪個schema
active:標記一個實體處於活動狀態,活動實體有更新、刪除和刷新方法
nameInDb:在數據中使用的別名,默認使用的是實體的類名
indexes:定義索引,可以跨越多個列
createInDb:標記創建數據庫表

2.基礎屬性注解

@Id :主鍵 Long型,可以通過@Id(autoincrement = true)設置自增長
@Property:設置一個非默認關系映射所對應的列名,默認是的使用字段名 舉例:@Property (nameInDb="name")
@NotNul:設置數據庫表當前列不能為空
@Transient :添加次標記之後不會生成數據庫表的列

3.索引注解

@Index:使用@Index作為一個屬性來創建一個索引,通過name設置索引別名,也可以通過unique給索引添加約束
@Unique:向數據庫列添加了一個唯一的約束

4.關系注解

@ToOne:定義與另一個實體(一個實體對象)的關系
@ToMany:定義與多個實體對象的關系

編譯項目,User實體類會自動編譯,生成get、set方法並且會在com.greendao.gen目錄下生成三個文件,DaoMaster 、DaoSession、Dao類;

編寫幫助類

public class GreenDaoHelper {

    private static DaoMaster.DevOpenHelper mHelper;
    private static SQLiteDatabase db;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;

    /**
     * 初始化greenDao,這個操作建議在Application初始化的時候添加;
     */
    public static void initDatabase() {
        // 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。
        // 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。
        // 注意:默認的 DaoMaster.DevOpenHelper 會在數據庫升級時,刪除所有的表,意味著這將導致數據的丟失。
        // 所以,在正式的項目中,你還應該做一層封裝,來實現數據庫的安全升級。
        mHelper = new DaoMaster.DevOpenHelper(MyApplication.context, "cache-db", null);
        db = mHelper.getWritableDatabase();
        // 注意:該數據庫連接屬於 DaoMaster,所以多個 Session 指的是相同的數據庫連接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    public static DaoSession getDaoSession() {
        return mDaoSession;
    }
    public static SQLiteDatabase getDb() {
        return db;
    }

}

增刪改查

首先獲取UserDao對象:

mUserDao = GreenDaoHelper.getDaoSession().getUserDao();

數據庫的增刪改查我們都將通過UserDao來進行,插入操作如下:

mUser = new User((long)1,"張三");
mUserDao.insert(mUser);//添加一個

User的第一個參數為id,如果這裡傳null的話在插入的過程中id字段會自動增長(現在知道為什麼id要為Long類型了吧!)

刪除數據和修改數據的思路一樣,都是要先查找到數據:

List userList = (List) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();  
        for (User user : userList) {  
            mUserDao.delete(user);  
        }  

where表示查詢條件,這裡我是查詢id小於等於10的數據,where中的參數可以有多個,就是說可以添加多個查詢條件。最後的list表示查詢結果是一個List集合,如果你只想查詢一條數據,最後unique即可。當然,我們也可以根據id來刪除數據:

User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();  
        if (user == null) {  
            Toast.makeText(MainActivity.this, "用戶不存在", Toast.LENGTH_SHORT).show();  
        }else{  
            mUserDao.deleteByKey(user.getId());  
        }  

根據主鍵刪除

mUserDao.deleteByKey(id);

刪除所有數據

mUserDao.deleteAll();

根據ID修改數據

mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);

查詢全部數據

List users = mUserDao.loadAll();  

查詢一條數據

User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("張三")).unique();

數據庫升級

數據庫的升級其實就兩個步驟我們來看看

1.修改gradle文件

首先在module的gradle文件中修改版本號:
//這裡改為最新的版本號
schemaVersion 2

2.修改實體類

@Entity  
public class User {  
    @Property  
    private int age;  
    @Property  
    private String password;  
    @Id  
    private Long id;  
    @Property(nameInDb = "USERNAME")  
    private String username;  
    @Property(nameInDb = "NICKNAME")  
    private String nickname;  
} 

重現編譯項目運行即可。一般的數據庫升級這樣就可以了,特殊情況可能需要自己編寫數據庫遷移腳本。

總結

總體來說,GreenDao3.0在配置上相對於2.0要簡單的多。
個人還是比較喜歡3.0版本的,希望大家活學活用。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved