GreenDao3.0使用.md

greendao

介紹

  • 據(jù)說是Android中最快的的Orm革答。

官網(wǎng)地址

GreenDao github

GreenDao 優(yōu)點

  1. 性能高,號稱Android最快的關(guān)系型數(shù)據(jù)庫
  2. 內(nèi)存占用小
  3. 庫文件比較小参淫,小于100K,編譯時間低愧杯,而且可以避免65K方法限制
  4. 支持數(shù)據(jù)庫加密 greendao支持SQLCipher進行數(shù)據(jù)庫加密 有關(guān)SQLCipher可以參考這篇博客Android數(shù)據(jù)存儲之Sqlite采用SQLCipher數(shù)據(jù)庫加密實戰(zhàn)
  5. 簡潔易用的API

GreenDao 3.0基本使用

在.gradle添加依賴

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

apply plugin: 'org.greenrobot.greendao'

dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

需要配置數(shù)據(jù)庫的基本屬性

    greendao {
        schemaVersion 1
        targetGenDir 'src/main/java'
    }
  • schemaVersion:數(shù)據(jù)庫版本號
  • daoPackage:設(shè)置DaoMaster, DaoSession, Dao包名
  • targetGenDir: 設(shè)置DaoMaster, DaoSession, Dao目錄
  • targetGenDirTest: 設(shè)置生成單元測試目錄
  • generateTests 設(shè)置自動生成單元測試用例

創(chuàng)建實體

@Entity()
public class User {

    @Id
    private Long id;
    private String name;
    private int age;
    //省去了get/set方法
}

實體@Entity注解:

  • schema:表示GreenDao當前實體屬于哪個schema
  • active: 標記一個實體處于活動狀態(tài)涎才,活動實體有更新,刪除和刷新方法
  • nameInDb: 在數(shù)據(jù)中使用的別名力九,默認使用的是實名的類別
  • indexes: 定義索引耍铜,可以跨越多個列
  • createInDb: 標記創(chuàng)建數(shù)據(jù)庫表

基礎(chǔ)屬性注解:

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

索引注解:

  • @Index:使用@Index作為一個屬性來創(chuàng)建一個索引棕兼,通過name設(shè)置索引別名,也可以通過unique給索引添加約束
  • @Unique:向數(shù)據(jù)庫列添加了一個唯一的約束

關(guān)系注解:

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

編譯生成DaoMaster, DaoSession, Dao

image
  • 創(chuàng)建一個數(shù)據(jù)庫管理者單例
public class DBManager {
    private final static String dbName = "test_db";
    private static DBManager mInstance;
    private DaoMaster.DevOpenHelper openHelper;
    private Context context;

    public DBManager(Context context) {
        this.context = context;
        openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
    }

    /**
     * 獲取單例引用
     *
     * @param context
     * @return
     */
    public static DBManager getInstance(Context context) {
        if (mInstance == null) {
            synchronized (DBManager.class) {
                if (mInstance == null) {
                    mInstance = new DBManager(context);
                }
            }
        }
        return mInstance;
    }
}
  • 獲取可讀可寫數(shù)據(jù)庫

    /**
     * 獲取可讀數(shù)據(jù)庫
     */
    private SQLiteDatabase getReadableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        return openHelper.getReadableDatabase();
    }

    /**
     * 獲取可寫數(shù)據(jù)庫
     */
    private SQLiteDatabase getWritableDatabase() {
        if (openHelper == null) {
            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
        }
        return openHelper.getWritableDatabase();
    }

    /**
     * 插入一條記錄
     *
     * @param user
     */
    public void insertUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.insert(user);
    }

    /**
     * 插入用戶集合
     *
     * @param users
     */
    public void insertUserList(List<User> users) {
        if (users == null || users.isEmpty()) {
            return;
        }
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.insertInTx(users);
    }

    /**
     * 刪除一條記錄
     *
     * @param user
     */
    public void deleteUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.delete(user);
    }

    /**
     * 更新一條記錄
     *
     * @param user
     */
    public void updateUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        userDao.update(user);
    }

    /**
     * 查詢用戶列表
     */
    public List<User> queryUserList() {
        DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        QueryBuilder<User> qb = userDao.queryBuilder();
        return qb.list();
    }

    /**
     * 查詢用戶列表
     */
    public List<User> queryUserList(int age) {
        DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
        DaoSession daoSession = daoMaster.newSession();
        UserDao userDao = daoSession.getUserDao();
        QueryBuilder<User> qb = userDao.queryBuilder();
        qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age);
        return qb.list();
    }

外鍵使用(@ToOne, @ToMany)

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

    @NotNull
    private String name;

    private int age;
    
    private Long blogId;

    @ToOne(joinProperty = "blogId")
    private Blog blog;
}

  • joinProperties這個參數(shù)是referencedJoinProperty 參數(shù)的升級版抵乓。在referencedJoinProperty參數(shù)中我們發(fā)現(xiàn)倆個實體關(guān)聯(lián)的外鍵是CustomerId與id伴挚,但是如果我們的需求是外鍵不能通過id來定義,需要用自己自定義屬性來定義灾炭,第一種方法就沒法用了茎芋,而joinProperties就是為了解決這個需求的。

github源碼

參考資料

GreenDao 3.0使用

Android數(shù)據(jù)存儲之GreenDao 3.0 詳解

GreenDao3.0新特性解析(配置蜈出、注解败徊、加密

史上最高效的ORM方案——GreenDao3.0高級用法

http://blog.csdn.net/io_field/article/details/52214099

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掏缎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煤杀,老刑警劉巖眷蜈,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沈自,居然都是意外死亡酌儒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門枯途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忌怎,“玉大人,你說我怎么就攤上這事酪夷×裥ィ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵晚岭,是天一觀的道長鸥印。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么库说? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任狂鞋,我火速辦了婚禮,結(jié)果婚禮上潜的,老公的妹妹穿的比我還像新娘骚揍。我一直安慰自己,他們只是感情好啰挪,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布信不。 她就那樣靜靜地躺著,像睡著了一般脐供。 火紅的嫁衣襯著肌膚如雪浑塞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天政己,我揣著相機與錄音酌壕,去河邊找鬼。 笑死歇由,一個胖子當著我的面吹牛卵牍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沦泌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼糊昙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谢谦?” 一聲冷哼從身側(cè)響起释牺,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎回挽,沒想到半個月后没咙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡千劈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年祭刚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墙牌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡涡驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喜滨,到底是詐尸還是另有隱情捉捅,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布鸿市,位于F島的核電站锯梁,受9級特大地震影響即碗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陌凳,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一剥懒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧合敦,春花似錦初橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崔梗,卻和暖如春夜只,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒜魄。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工扔亥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈为。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓旅挤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伞鲫。 傳聞我的和親對象是個殘疾皇子粘茄,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容