Android ORM 框架 GreenDao 使用詳解 一、前言 二、greenDAO 概述 三、ORM 框架概述 四、項目案例演示 五、greenDAO 使用步驟 六、小結

一、前言

關於 Android 中常用的數據存儲方式有 Sp 存儲 和 文件存儲,但是對於數據量比較大,並且結構複雜的數據我們想要存儲只能通過數據庫進行處理,Android 中提供了一個 SQLite 數據庫,但是使用起來比較繁瑣和複雜,所以 Android 又推出了 Room 持久性庫,Room 持久性庫在 SQLite 的基礎上提供了一個抽象層,讓用戶能夠在充分利用 SQLite 的強大功能的同時,獲享更強健的數據庫訪問機制。但是我們今天不講 Room 這個組件(以後講 Jetpack 組件的時候再講),我們今天來講一個開源的安卓 ORM 框架———greenDAO

二、greenDAO 概述

greenDAO 是適用於 Android 的輕量級快速 ORM 框架,可將對象映射到 SQLite 數據庫中。 並且針對 Android 進行了高度的優化,greenDAO 提供了出色的性能,並佔用了最少的內存,優點如下:

  • 性能上(可能是 Android 上最快的 ORM 框架);
  • 易用性上(提供強大並且簡潔明瞭的 API);
  • 輕量(最小的內存消耗與小於 150KB 的庫大小)。

三、ORM 框架概述

所謂 ORM 框架,即 Object-Relational Mapping,它的作用是在關係型數據庫和對象之間作一個映射,這樣,我們在具體操作數據庫的時候,就不需要再去和複雜的 SQL 語句打交道,只是像平時操作對象一樣操作它就可以了。

四、項目案例演示

案例具體效果如下所示:


這個案例就是利用 greenDAO 對商品進行增刪改查。

點擊插入數據,就會把所有的數據保存到數據庫中,點擊查詢所有數據,會將數據庫中的所有數據查詢出來,並顯示在界面上,同時也可以根據條件進行查詢,當點擊查詢零食類時,只會將零食查詢出來顯示在桌面上,點擊單個商品,會跳轉到商品詳情頁,在商品詳情頁可以對商品的描述進行修改,同時也可以刪除商品。

商品的列表顯示是用 RecyclerView 進行實現的。

五、greenDAO 使用步驟

5.1、準備工作

5.1.1、引入 greenDAO

greenDAO 的引入非常簡單,我們只要按照 github 文檔 上去做就可以了,具體如下所示:

5.1.2、創建實體類

@Entity
public class GoodsModel implements Parcelable {
    @Id(autoincrement = true)
    private Long id;
    @Index(unique = true)
    private Integer goodsId;
    private String name;
    private String icon;
    private String info;
    private String type;

其中 @EntitygreenDAO 的實體註解(用於標識當前實體需要 GreenDao 生成代碼)。

@Id 是主鍵 idLong 類型,可以通過 @Id(autoincrement = true) 設置自動增長(自動增長主鍵不能用基本類型 long,只能用包裝類型 Long)。

@Index(unique = true) 是向數據庫添加了唯一約束。

5.1.3、自動生成實體類代碼

寫完上面實體類代碼之後,接下來實體類代碼的生成就交給 Android Studio 編譯器就可以了,首先我們點擊菜單欄中 Build 然後點擊 Make Project,等待編譯器編譯完就可以了,編譯完後實體類代碼如下所示:(這裏實現了 Parcelable 接口是爲了在 Activity 之間傳遞實體類,實現接口的方法一直 Alt + Enter 就可以了)

@Entity
public class GoodsModel implements Parcelable {
    @Id(autoincrement = true)
    private Long id;
    @Index(unique = true)
    private Integer goodsId;
    private String name;
    private String icon;
    private String info;
    private String type;

    protected GoodsModel(Parcel in) {
        if (in.readByte() == 0) {
            id = null;
        } else {
            id = in.readLong();
        }
        if (in.readByte() == 0) {
            goodsId = null;
        } else {
            goodsId = in.readInt();
        }
        name = in.readString();
        icon = in.readString();
        info = in.readString();
        type = in.readString();
    }

    @Generated(hash = 1834473137)
    public GoodsModel(Long id, Integer goodsId, String name, String icon,
                      String info, String type) {
        this.id = id;
        this.goodsId = goodsId;
        this.name = name;
        this.icon = icon;
        this.info = info;
        this.type = type;
    }

    @Generated(hash = 971639536)
    public GoodsModel() {
    }

    public static final Creator<GoodsModel> CREATOR = new Creator<GoodsModel>() {
        @Override
        public GoodsModel createFromParcel(Parcel in) {
            return new GoodsModel(in);
        }

        @Override
        public GoodsModel[] newArray(int size) {
            return new GoodsModel[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        if (id == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeLong(id);
        }
        if (goodsId == null) {
            dest.writeByte((byte) 0);
        } else {
            dest.writeByte((byte) 1);
            dest.writeInt(goodsId);
        }
        dest.writeString(name);
        dest.writeString(icon);
        dest.writeString(info);
        dest.writeString(type);
    }

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

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

    public Integer getGoodsId() {
        return this.goodsId;
    }

    public void setGoodsId(Integer goodsId) {
        this.goodsId = goodsId;
    }

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

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

    public String getIcon() {
        return this.icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getInfo() {
        return this.info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getType() {
        return this.type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

點擊編譯後,編譯器不僅會爲我們自動完成實體類代碼的生成,還會在 build 目錄下生成三個文件 DaoMasterDaoSessionXXXDao。利用這三個文件我們就可以操作數據庫了,如下所示:

5.1.4、初始化 greenDAO

我這裏是在 Application 裏面初始化(注意要在清單文件裏面引用,否則 Application 不生效),並提供一個getDaoSession() 的方法供外部使用,具體代碼如下:

public class MyApplication extends Application {

    public static DaoSession mSession;

    @Override
    public void onCreate() {
        super.onCreate();

        initDb();
    }

    /**
     * 連接數據庫並創建會話
     */
    public void initDb() {
        // 1、獲取需要連接的數據庫
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "test.db");
        SQLiteDatabase db = devOpenHelper.getWritableDatabase();
        // 2、創建數據庫連接
        DaoMaster daoMaster = new DaoMaster(db);
        // 3、創建數據庫會話
        mSession = daoMaster.newSession();
    }

    // 供外接使用
    public DaoSession getDaoSession() {
        return mSession;
    }
}

5.2、具體使用(增刪改查)

準備工作做完之後,使用起來就非常簡單了,只需要調用 greenDAOAPI 就可以了。要想操作數據庫,我們首先要獲取 DAO 實例,我們創建一個 GreenDaoManager 類來專門管理數據庫的操作,具體代碼如下所示:

public class GreenDaoManager {

    private Context mContext;
    private GoodsModelDao mGoodsModelDao;

    public GreenDaoManager (Context context) {
        this.mContext = context;
        // 獲取DAO實例
        mGoodsModelDao = MyApplication.getDaoSession().getGoodsModelDao();
    }
}

5.2.1、新增數據

// 添加一個實體
DAO.insert(T entity);
// 添加多個實體
DAO.insertInTx(T... entities);
...
// 插入數據
public void insertGoods () {
    String json = DataUtils.getJson("goods.json", mContext);
    mGoodsModelDao.insertOrReplaceInTx(DataUtils.getGoodsModels(json));
}

5.2.2、查詢數據

1)、查詢所有

DAO.loadAll();
// 查詢所有數據
public List<GoodsModel> queryGoods () {
    return mGoodsModelDao.loadAll();
}

2)、根據主鍵查詢

DAO.load(Long key);

3)、利用 QueryBuilder 與 properties 設置查詢條件

// 查詢水果的數據
public List<GoodsModel> queryFruits () {
    QueryBuilder<GoodsModel> result = mGoodsModelDao.queryBuilder();
    //藉助Property屬性類提供的篩選方法
    result = result.where(GoodsModelDao.Properties.Type.eq("0")).orderAsc(GoodsModelDao.Properties.GoodsId);
    return result.list();
}

5.2.3、更新數據

DAO.update(T entity);
DAO.updateInTx(T... entities);
...
// 修改指定商品的商品信息
public void updateGoodsInfo (GoodsModel model) {
    mGoodsModelDao.update(model);
}

5.2.3、刪除數據

DAO.delete(T entity);
DAO.deleteAll();
DAO.deleteByKey(K key);
...
// 刪除指定商品
public void deleteGoodsInfo (GoodsModel model) {
    mGoodsModelDao.deleteByKey(model.getId());
}

5.2.4、GreenDaoManager 完整代碼

public class GreenDaoManager {

    private Context mContext;
    private GoodsModelDao mGoodsModelDao;

    public GreenDaoManager (Context context) {
        this.mContext = context;
        // 獲取DAO實例
        mGoodsModelDao = MyApplication.getDaoSession().getGoodsModelDao();
    }

    // 添加所有的數據到數據庫
    public void insertGoods () {
        String json = DataUtils.getJson("goods.json", mContext);
        // 如果不想因爲重複添加數據而導致崩潰,可以使用insertOrReplaceInTx API
        mGoodsModelDao.insertOrReplaceInTx(DataUtils.getGoodsModels(json));
    }

    // 查詢所有的數據
    public List<GoodsModel> queryGoods () {
        return mGoodsModelDao.loadAll();
    }

    // 查詢水果的數據
    public List<GoodsModel> queryFruits () {
        QueryBuilder<GoodsModel> result = mGoodsModelDao.queryBuilder();

        //藉助Property屬性類提供的篩選方法
        result = result.where(GoodsModelDao.Properties.Type.eq("0")).orderAsc(GoodsModelDao.Properties.GoodsId);

        return result.list();
    }

    // 查詢零食的數據
    public List<GoodsModel> querySnacks () {
        QueryBuilder<GoodsModel> result = mGoodsModelDao.queryBuilder();
        // 藉助Property屬性類提供的篩選方法
        result = result.where(GoodsModelDao.Properties.Type.eq("1")).orderAsc(GoodsModelDao.Properties.GoodsId);
        return result.list();
    }

    // 修改指定商品的商品信息
    public void updateGoodsInfo (GoodsModel model) {
        mGoodsModelDao.update(model);
    }

    // 刪除指定商品
    public void deleteGoodsInfo (GoodsModel model) {
        mGoodsModelDao.deleteByKey(model.getId());
    }

}

六、小結

greenDAO 的使用步驟其實就三步

  1. 創建實體類;
  2. 生成對應的 DaoMasterDaoSessionDao
  3. 通過 Dao 對象完成增刪改查

最後

小編在這將自己收集的一份《Android核心知識彙總》分享給大家,希望能對大家有所幫助。請點擊GitHub獲取。 喜歡本文的話,不妨順手給我點個小贊、評論區留言或者轉發支持一下唄~

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