1. 程式人生 > >Android ORM系列之GreenDao最佳實踐

Android ORM系列之GreenDao最佳實踐

GreenDAO是一個可以幫助Android開發者快速將Java物件對映到SQLite資料庫的表單中的ORM解決方案,通過使用一個簡單的面向物件API,開發者可以對Java物件進行儲存、更新、刪除和查詢。

GreenDao有兩個專案,一個是生成dao和model的generator的專案,該專案是java專案,一個是用於android的核心jar包。在使用前,我們必須先生成dao和model。

首先加入依賴。

compile 'de.greenrobot:greendao:2.0.0'
compile 'de.greenrobot:greendao-generator:2.0.0'

然後在我們的包名之下新建一個db的包,在db下新建dao和model的包以及一個generator的包,就像下圖。
這裡寫圖片描述

在generator包下,新建一個生成dao和model的類GreenDaoGenerator,在裡面加入程式碼

public class GreenDaoGenerator {
    public static void main(String[] args) throws Exception {
        Schema schema = new Schema(1, "cn.edu.zafu.greendao.db.model");
        schema.setDefaultJavaPackageDao("cn.edu.zafu.greendao.db.dao");
schema.enableKeepSectionsByDefault(); //schema.enableActiveEntitiesByDefault(); //ActiveRecord addEntity(schema); new DaoGenerator().generateAll(schema, "./app/src/main/java"); } private static void addEntity(Schema schema) { Entity person = schema.addEntity
("Person"); person.addIdProperty().primaryKey(); person.addStringProperty("name"); person.addDoubleProperty("height"); person.addDoubleProperty("weight"); Entity card = schema.addEntity("Card"); card.addIdProperty().primaryKey(); card.addStringProperty("num"); card.addStringProperty("address"); Property idcardPK = person.addLongProperty("cardId").getProperty(); person.addToOne(card, idcardPK); Property personPK = card.addLongProperty("personId").getProperty(); card.addToOne(person,personPK); } }

Schema schema = new Schema(1, “cn.edu.zafu.greendao.db.model”); 代表建立的資料庫的版本號以及預設的java package,如果不修改預設的包名,生成的dao和model都會在該包下,這裡我們修改了dao的包名schema.setDefaultJavaPackageDao(“cn.edu.zafu.greendao.db.dao”);,生成的model中,我們可能需要加入自己的一些資訊,但是又不希望下次生成的時候消失,所以可以使用schema.enableKeepSectionsByDefault();,使用後會在model類中有如下這些標示

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END

// KEEP FIELDS - put your custom fields here
// KEEP FIELDS END

 // KEEP METHODS - put your custom methods here
// KEEP METHODS END

你只需將你需要的資訊新增到這三個之間,分佈代表引入的包,欄位,方法。之後重新生成這些資訊將會被保留。

schema.enableActiveEntitiesByDefault();代表實體類是否支援active,用過php中yii框架的都應該清楚,實體類可以直接進行crud操作。我們不開啟就好了,如果開啟了的話,實體類將之間支援update, refresh, deleted 等操作。

之後就使用 schema.addEntity()函式增加Entity 物件,即對應的實體類,通過新增屬性方法addProperty系列方法增加欄位,最後呼叫new DaoGenerator().generateAll(schema, “./app/src/main/java”);方法生成dao和model。

生成的步驟也很簡單,在該類上右鍵,點run即可。

這裡寫圖片描述

生成之後控制檯就會輸出

這裡寫圖片描述

然後我們編寫一個核心輔助類。用於獲取DaoMaster和DaoSession

public class DbCore {
    private static final String DEFAULT_DB_NAME = "default.db";
    private static DaoMaster daoMaster;
    private static DaoSession daoSession;

    private static Context mContext;
    private static String DB_NAME;

    public static void init(Context context) {
        init(context, DEFAULT_DB_NAME);
    }

    public static void init(Context context, String dbName) {
        if (context == null) {
            throw new IllegalArgumentException("context can't be null");
        }
        mContext = context.getApplicationContext();
        DB_NAME = dbName;
    }

    public static DaoMaster getDaoMaster() {
        if (daoMaster == null) {
            DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(mContext, DB_NAME, null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    public static DaoSession getDaoSession() {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    public static void enableQueryBuilderLog(){

        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }
}

接下來就是基礎的泛型Service

public class BaseService<T, K> {
    private AbstractDao<T, K> mDao;


    public BaseService(AbstractDao dao) {
        mDao = dao;
    }


    public void save(T item) {
        mDao.insert(item);
    }

    public void save(T... items) {
        mDao.insertInTx(items);
    }

    public void save(List<T> items) {
        mDao.insertInTx(items);
    }

    public void saveOrUpdate(T item) {
        mDao.insertOrReplace(item);
    }

    public void saveOrUpdate(T... items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void saveOrUpdate(List<T> items) {
        mDao.insertOrReplaceInTx(items);
    }

    public void deleteByKey(K key) {
        mDao.deleteByKey(key);
    }

    public void delete(T item) {
        mDao.delete(item);
    }

    public void delete(T... items) {
        mDao.deleteInTx(items);
    }

    public void delete(List<T> items) {
        mDao.deleteInTx(items);
    }

    public void deleteAll() {
        mDao.deleteAll();
    }


    public void update(T item) {
        mDao.update(item);
    }

    public void update(T... items) {
        mDao.updateInTx(items);
    }

    public void update(List<T> items) {
        mDao.updateInTx(items);
    }

    public  T query(K key) {
        return  mDao.load(key);
    }

    public List<T> queryAll() {
        return mDao.loadAll();
    }

    public List<T> query(String where, String... params) {

        return mDao.queryRaw(where, params);
    }

    public QueryBuilder<T> queryBuilder() {

        return mDao.queryBuilder();
    }

    public long count() {
        return mDao.count();
    }

    public void refresh(T item) {
        mDao.refresh(item);

    }

    public void detach(T item) {
        mDao.detach(item);
    }
}

一個實現類,第二個泛型引數是主鍵型別

public class CardService extends BaseService<Card,Long> {
    public CardService(CardDao dao) {
        super(dao);
    }
}
public class PersonService extends BaseService<Person,Long> {
    public PersonService(PersonDao dao) {
        super(dao);
    }
}

編寫一個工具類獲得service

public class DbUtil {
    private static CardService cardService;
    private static PersonService personService;


    private static PersonDao getPersonDao() {
        return DbCore.getDaoSession().getPersonDao();
    }

    private static CardDao getCardDao() {
        return DbCore.getDaoSession().getCardDao();
    }

    public static CardService getCardService() {
        if (cardService == null) {
            cardService = new CardService(getCardDao());
        }
        return cardService;
    }

    public static PersonService getPersonService() {
        if (personService == null) {
            personService = new PersonService(getPersonDao());
        }
        return personService;
    }
}

在Application中初始化,並設定在清單檔案中

public class App extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        DbCore.init(this);
    }
}

增刪改查,下面為單元測試的方法

public class ApplicationTest extends ApplicationTestCase<Application> {
    private PersonService mPersonService;
    private CardService mCardService;

    public ApplicationTest() {
        super(Application.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        DbCore.init(getContext());
        DbCore.enableQueryBuilderLog();
        mPersonService = DbUtil.getPersonService();
        mCardService = DbUtil.getCardService();
    }

    public void testSave(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        mCardService.save(c);

        Person p=new Person();
        p.setName("張三");
        p.setHeight(178.00);
        p.setWeight(65.00);
        p.setCard(c);
        mPersonService.save(p);

        c.setPerson(p);
        mCardService.saveOrUpdate(c);

    }
    public void testSave1(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("溫州");

        mCardService.save(c, c1);

        c.setNum("11111");
        mCardService.saveOrUpdate(c, c1);


    }

    public void testSave2(){
        Card c=new Card();
        c.setNum("3303241646813416463468");
        c.setAddress("杭州");

        Card c1=new Card();
        c1.setNum("12121646813416463468");
        c1.setAddress("溫州");

        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);


        mCardService.save(cards);

        c1.setNum("22222");

        mCardService.saveOrUpdate(cards);



    }


    public void testDelete(){
        Card c=new Card();
        c.setNum("333333333333333");
        c.setAddress("3333");

        mCardService.save(c);
        mCardService.delete(c);

        c=new Card();
        c.setNum("444444");
        c.setAddress("44444444");

        mCardService.save(c);
        mCardService.deleteByKey(c.getId());

    }

    public void testDelete1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");



        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        mCardService.save(c,c1);
        mCardService.delete(c, c1);

    }

    public void testDelete2(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        Card c1=new Card();
        c1.setNum("666666");
        c1.setAddress("66666666");
        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);

        mCardService.save(cards);
        mCardService.delete(cards);

    }

    public  void testDelete3(){
        mCardService.deleteAll();
    }

    public void testUpdate(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");
        mCardService.update(c);
    }
    public void testUpdate1(){
        Card c=new Card();
        c.setNum("55555");
        c.setAddress("5555");

        mCardService.save(c);
        c.setNum("123456");

        Card c1=new Card();
        c1.setNum("6666");
        c1.setAddress("66666");

        mCardService.save(c1);
        c1.setNum("654321");
        mCardService.update(c,c1);
    }

    public void testUpdate2(){
        Card c=new Card();
        c.setNum("aaaaa");
        c.setAddress("aaaaaaaaaa");

        mCardService.save(c);
        c.setNum("bbbbbbbbb");

        Card c1=new Card();
        c1.setNum("ccccc");
        c1.setAddress("cccccccc");

        mCardService.save(c1);
        c1.setNum("dddddddddd");

        List<Card> cards=new ArrayList<Card>();

        cards.add(c);
        cards.add(c1);
        mCardService.update(cards);
    }

    public void testQuery(){
        Card c=new Card();
        c.setNum("aaaaa111");
        c.setAddress("aaaaaaaa11111aa");

        mCardService.save(c);

        List<Card> cards = mCardService.queryAll();
        Log.e("TAG", cards + "");

        Card query = mCardService.query(c.getId());
        Log.e("TAG", query + "");

        List<Card> query1 = mCardService.query("where NUM=?", c.getNum());
        Log.e("TAG", query1 + "");

        long count = mCardService.count();
        Log.e("TAG", count + "");

        List<Card> list = mCardService.queryBuilder().where(CardDao.Properties.Num.eq(c.getNum())).list();
        Log.e("TAG", list + "");
    }
}

關於關聯關係的對映,下一篇文章細說。

原始碼下載。

相關推薦

Android ORM系列GreenDao最佳實踐

GreenDAO是一個可以幫助Android開發者快速將Java物件對映到SQLite資料庫的表單中的ORM解決方案,通過使用一個簡單的面向物件API,開發者可以對Java物件進行儲存、更新、刪除和查詢。 GreenDao有兩個專案,一個是生成dao和

Android ORM 框架 greenDAO 使用心得

前言 我相信,在平時的開發過程中,大家一定會或多或少地接觸到 SQLite。然而在使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與解析查詢結果等。所以,適用於 Android 的ORM 框架也就孕育而生了,現在市面上主流的框架有 OrmLite、SugarOR

Android ORM資料庫GreenDao使用教程及原始碼分析

一、簡介 1.Android ORM介紹  在平時的開發過程中,大家一定會或多或少地接觸到 SQLite。然而在使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與解析查詢結果等。所以,適用於 Android 的ORM 框架也就孕育而生了,現在市面

Android 快速開發系列 ORMLite 框架最佳實踐

                上一篇已經對ORMLite框架做了簡單的介紹:Android ORMLite 框架的入門用法~~本篇將介紹專案可能會使用到的一些用法,也為我們的使用ORMLite框架總結出一個較合理的用法。通過上一篇的瞭解,我們使用ORMLite,需要自己寫一個DatabaseHelper去繼

Android 進階】ORM 框架 greenDAO學習筆記

前言 當初學習Hibernate的時候就非常驚歎這種ORM思想,後來才知道原來Android中也有這種基於ORM思想的開源框架greenDAO。 greenDAO簡介: 簡單的講,greenDAO 是一個將物件對映到 SQLite 資料庫

Android Debug Log 最佳實踐

本文微信公眾號「AndroidTraveler」首發。 背景 在開發過程中,除錯是必不可少的一項工作。 當我們要確定專案的邏輯時,當我們要了解介面的生命週期時,當我們發現新寫的邏輯與期望效果不一致時,當我們覺得資料有問題時...... 而除錯有兩種方式: 第一種就是使用 debug 模式執行 APP,然後通過

Android開發系列SQLite

分組 ets ket where pla 情況 流行 database which 上篇博客提到過SQLite。它是嵌入式數據庫,因為其輕巧但功能強大,被廣泛的用於嵌入式設備其中。後來在智能手機、平板流行之後,它作為文件型數據庫,差點兒成為了智能設備單機數據庫的必選,能夠

Android開發系列學習路線圖

權限 原生開發 edi post 設計 多少 方法 b2c art 通過前面的3篇博客已經簡單的介紹了Android開發的過程並寫了一個簡單的demo,了解了Android開發的環境以及一些背景知識。接下來這篇博客不打算繼續學習Android開發的細節,先停一下,明白一下

談談-Android-PickerView系列源碼解析(二)

需求 動態 () comm tag 多個 來源 ntc 寬高 前言   WheelView想必大家或多或少都有一定了解, 它是一款3D滾輪控件,效果類似IOS 上面的UIpickerview 。按照國際慣例,先放一張效果圖:   以上是Android-PickerView

Android回顧系列——HttpUrlConnect的使用

nco 留言 要求 idc stream extends value tput 回調 寫在前面:   最近準備一個關於Android的比賽。由於賽項要求,不得使用第三方工具、框架;故最近來溫習一下Google官方提供的原始API的使用。   說實話,用慣了第三方的庫,再

Android 應用兼容性最佳實踐 | 中文教學視頻

-s 播放 新特性 cmp 一起 更多 ide tar video 本期中文視頻向各位開發者介紹如何現代化您的應用,其中包括 Android?O、Android P?(預覽版)?的新特性、行為變更、應用開發中常見的兼容性最佳實踐,以及測試、兼容系統時需要註意的一些事項。希

Android 註解系列APT工具(三)

該文章中涉及的程式碼,我已經提交到GitHub上了,大家按需下載---->原始碼 前言 在上篇文章Android 註解系列之Annotation(二)中,簡要的介紹了註解的基本使用與定義。同時也提出了以下幾個問題,當我們聲明瞭一個註解後,是不是需要手動找到所有的Class

Android面試系列Handler機制篇

1.什麼是Handler?   Handler是可以通過傳送和處理Message和Runnable物件來關聯相應執行緒的MessageQueue。通常我們認為它是一種非同步機制。   a.可以讓對應的Message和Runnable在未來的某個時間點進行相應的處理。   

android studio系列使用指南

第一章 歡迎來到Android Studio 1.1 介紹Android Studio  Android Studio是一個基於IntelliJIDEA的新的Android開發環境。與Eclipse ADT外掛相似,AndroidStudio提供了整合的And

Android面試系列Android基礎知識

這兩天就要換工作了,為了拿到offer,是時候來一波面試準備了!希望自己能找到心儀的工作。也希望這篇部落格能幫助到大家。 本篇部落格是相對基礎的知識,雖然是基礎,但是很重要,你能保證你都記住了麼? Activity相關 Activity是四大元件之一,

Android webview系列webview簡介與存在的問題

文章目錄 引 一 webview簡介 1.1 Webview 1.2 WebViewSetting 1.2 WebViewClient 1.3 WebChromeClient 1.4 CookieManager

Android面試系列動畫

文章目錄 1.面試技巧 2.面試問題 3.內容 3.1 Android動畫有幾種 3.2 原理 未完待續 1.面試技巧 請移步本系列第一篇文章:android面試系列之面試技巧 2.面試問

android listview系列item的點選事件及item佈局中的點選事件(四)

很多時候listview只顯示簡略資訊,我們需要點選子項去跳轉或在顯示詳細資訊的位置,將相關的詳細資訊顯示出來,listview提供了onItemClickListener()方法,在方法中我們可以執行我們需要的內容。 listview.setOnItem

Android ORM 框架 Android中ORMLite應用基礎

ORMLite是常用的一個ORM框架,她不止可以用在Android的sqlite資料庫,也可以使用她操作其他常見的資料庫。這兒是根據官方文件抽取來的android用法。 一,新增依賴 匯入ormlite-core.jar和ormlite-android.

Android測試系列Instrumented Unit Test-Espresso

Instrumented unit tests are unit tests that run on physical devices and emulators, instead of the Java Virtual Machine (JVM) on you