GreenDAO快速入門

前言

之前在自己做項(xiàng)目的時(shí)候,用到了GreenDAO數(shù)據(jù)庫,其實(shí)對(duì)于數(shù)據(jù)庫輔助工具庫從OrmLite,到litePal再到GreenDAO,總是在不停的切換,但是沒有真正去了解他們的差異。只停留在會(huì)使用的階段。說起來也是慚愧。本文的重點(diǎn)也是在于如何快速使用。不會(huì)進(jìn)行較深的探究。


GreenDAO:

介紹:對(duì)象關(guān)系映射的數(shù)據(jù)庫(ORM)

GreenDAO

官網(wǎng)地址

  • 優(yōu)點(diǎn)
  1. 性能高,號(hào)稱Android最快的關(guān)系型數(shù)據(jù)庫
  2. 內(nèi)存占用小
  3. 庫文件小,編譯時(shí)間短
  4. 支持?jǐn)?shù)據(jù)庫加密
  5. API簡介易用

說了他的優(yōu)點(diǎn),那么我們來看下如何使用。


  • 導(dǎo)入
    首先在Project下的build.gradle中添加如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

...

在App中的build.gradle添加如下:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'

android {
  ...//省略
}

dependencies {

    ...//省略
    compile 'org.greenrobot:greendao:3.2.0'
}

  • 注解
實(shí)體@Entity注解
  1. schema:告知GreenDao當(dāng)前實(shí)體屬于哪個(gè)schema
  2. active:標(biāo)記一個(gè)實(shí)體處于活動(dòng)狀態(tài),活動(dòng)實(shí)體有更新、刪除和刷新方法
  3. nameInDb:在數(shù)據(jù)中使用的別名,默認(rèn)使用的是實(shí)體的類名
  4. indexes:定義索引,可以跨越多個(gè)列
  5. createInDb:標(biāo)記創(chuàng)建數(shù)據(jù)庫表
基礎(chǔ)屬性注解
  1. @Id :主鍵 Long型,可以通過@Id(autoincrement = true)設(shè)置自增長
  2. @Property:設(shè)置一個(gè)非默認(rèn)關(guān)系映射所對(duì)應(yīng)的列名,默認(rèn)是的使用字段名 舉例:@Property (nameInDb="name")
  3. @NotNul:設(shè)置數(shù)據(jù)庫表當(dāng)前列不能為空
  4. @Transient :添加次標(biāo)記之后不會(huì)生成數(shù)據(jù)庫表的列
索引注解
  1. @Index:使用@Index作為一個(gè)屬性來創(chuàng)建一個(gè)索引,通過name設(shè)置索引別名,也可以通過unique給索引添加約束
  2. @Unique:向數(shù)據(jù)庫列添加了一個(gè)唯一的約束
關(guān)系注解

@ToOne:定義與另一個(gè)實(shí)體(一個(gè)實(shí)體對(duì)象)的關(guān)系
@ToMany:定義與多個(gè)實(shí)體對(duì)象的關(guān)系
這里只是取出一些具有代表性的注解,想了解更多請(qǐng)查看上面官方文檔地址


在了解了基本的注解后我們來看下如何具體使用:

  1. 首先創(chuàng)建的我們的實(shí)體類
@Entity
public class User {

    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;
}

創(chuàng)建完成后需要Rebuild Project,之后User會(huì)變成:

@Entity
public class User {

    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;

    public User(String name, int age, String sex) {//自己添加的構(gòu)造方法,并非GreenDAO生成的
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated(hash = 689493095)
    public User(Long id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated(hash = 586692638)
    public User() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

同時(shí)會(huì)生成3個(gè)類:

圖片.png

UserDao:我們的增刪改查都是通過他來完成的。
DaoSession:用來注冊(cè)UserDao,提供創(chuàng)建UserDao的方法
DaoMaster:主要是用來創(chuàng)建DaoSession和一些更新,創(chuàng)建,刪除表的一些炒作
里面的源碼不多,有興趣的可以看下。
剩下的我們就來具體看下我們和進(jìn)行輸出操作:

public class DBManager {
    public static DBManager instance;

    private DaoMaster.DevOpenHelper mOpenHelper = null;
    private static final String DB_NAME = "test_db";
    private Context context;

    private DBManager(Context context) {
        this.context = context;
    }

    public static DBManager getInstance(Context context) {
        if (instance == null) {
            synchronized (DBManager.class) {
                if (instance == null) {
                    instance = new DBManager(context);
                }
            }
        }
        return instance;
    }

    public SQLiteDatabase getReadableDatabase() {
        if (mOpenHelper == null) {
            mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        }
        return mOpenHelper.getReadableDatabase();
    }

    public SQLiteDatabase getWritableDatabase() {
        if (mOpenHelper == null) {
            mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        }
        return mOpenHelper.getWritableDatabase();
    }

    //保存一個(gè)User
    public void saveUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.save(user);//與userDao.insert()大致相同區(qū)別在于如果不存在就插入,存在就Update修改

    }

    //保存User集合
    public void saveUserOrList(List<User> users) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.saveInTx(users);
    }

    //保存多個(gè)User
    public void saveUserOrUsers(User... users) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.saveInTx(users);
    }

    public void deleteUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.delete(user);
    }

    public void deleteUserById(Long id) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.deleteByKey(id);
    }

    public void updateUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.update(user);
    }

    public List<User> queryBySex(String sex) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        QueryBuilder<User> queryBuilder = userDao.queryBuilder();
        List<User> users = queryBuilder.where(UserDao.Properties.Sex.eq(sex)).list();
        return users;
    }
    public List<User> query() {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        List<User> users = userDao.queryBuilder().build().list();
        return users;
    }
    public List<User> queryByAge(int age) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        QueryBuilder<User> queryBuilder = userDao.queryBuilder();
        List<User> users = queryBuilder.offset(1)
                .limit(3)
                .orderAsc(UserDao.Properties.Age)
                .where(UserDao.Properties.Age.eq(age))
                .build()
                .list();
        return users;
    }

    public void updateDatabase(int version) {
        mOpenHelper.onUpgrade(getWritableDatabase(), 1, version);
    }
}

需要注意的是在升級(jí)數(shù)據(jù)庫的時(shí)候回將原來的數(shù)據(jù)刪除,可能會(huì)造成丟失推薦學(xué)習(xí)文章

GreenDAO的大部分操作都有這里。對(duì)于更高級(jí)的用法還需要大家自己去學(xué)習(xí)和探索,畢竟本文的核心和題目一樣,快速入門。
為了方便學(xué)習(xí)推薦一篇文章greenDAO 3.2 初探或者查閱官網(wǎng)地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,012評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • greenDAO greenDAO 是一個(gè)將對(duì)象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案。它...
    蕉下孤客閱讀 16,234評(píng)論 18 104
  • 雨季,似乎不走了,房子浸在水里。想起你。 你的房間,我是見過的,一床一柜一桌一椅,抽屜打開,是打火機(jī)。 我們從椅從...
    zxjzqn閱讀 293評(píng)論 0 0
  • 無言無語無落紗, 驚魂驚夢(mèng)驚晚霞, 殘陽殘景殘入畫, 悲詞悲句悲自話!
    車尾靠窗閱讀 865評(píng)論 0 3

友情鏈接更多精彩內(nèi)容