1. 程式人生 > >Android資料庫—GreenDAO簡單詳解

Android資料庫—GreenDAO簡單詳解

這裡寫圖片描述

簡單介紹

greenDao是一個將物件對映到SQLite資料庫中的輕量且快速的ORM解決方案。
關於greenDAO的概念可以看官網 (greenDAO)
這裡寫圖片描述

greenDAO

官網中明確指明瞭其首要設計目標:
Maximum performance (probably the fastest ORM for Android):系能最大化
Easy to use APIs:便於使用
Highly optimized for Android:對於Android高度優化
Minimal memory consumption:最小化記憶體開銷
Small library size, focus on the essentials:較小的檔案體積,只集中在必要的部分上。
小總結:


1、一個精簡的庫
2、效能最大化
3、記憶體開銷最小化
4、易於使用的 APIs
5、對 Android 進行高度優化

GREENDAO 設計的主要特點

greenDAO 效能遠遠高於同類的 ORMLite,具體測試結果可見官網
greenDAO 支援 protocol buffer(protobuf) 協議資料的直接儲存,如果你通過 protobuf 協議與伺服器互動,將不需要任何的對映。

與 ORMLite 等使用註解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,這也是其效能能大幅提升的原因。

優點:
效率很高,插入和更新的速度是sqlite的2倍,載入實體的速度是ormlite的4.5倍。官網測試結果:http:/
/greendao-orm.com/features/
檔案較小(<100K),佔用更少的記憶體 ,但是需要create Dao,
操作實體靈活:支援get,update,delete等操作

缺點:

學習成本較高。其中使用了一個java工程根據一些屬性和規則去generate一些基礎程式碼,類似於javaBean但會有一些規則,另外還有QueryBuilder、Dao等API,所以首先要明白整個過程,才能方便使用。沒有ORMLite那樣封裝的完整,不過greenDao的官網上也提到了這一點,正是基於generator而不是反射,才使得其效率高的多。

另外GreenDao支援Protocol buffers協議資料的直接儲存 ,如果通過protobuf協議和伺服器互動,不需要任何的對映。

Protocol Buffers協議:以一種高效可擴充套件的對結構化資料進行編碼的方式。google內部的RPC協議和檔案格式大部分都是使用它。

RPC:遠端過程呼叫(Remote Procedure Call,RPC)是一個計算機通訊協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。
這裡寫圖片描述

DaoMaster:使用greendao切入點。daomaster儲存資料庫物件(SQLite資料庫管理)和DAO類對於一個特定的模式。通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 物件。

DaoSession:管理特定架構的所有可用的DAO物件,你可以使用一個getter方法獲得。daosession還提供了一些通用的永續性方法如插入、更新和刪除,重新整理載入,實體。

DAOs:資料訪問物件(DAO)堅持和查詢實體。每一個實體,greendao產生一道。它比daosession,更持久的方法例如:計數,loadall,和insertintx。

GreenDao 3.0使用

GreenDao 3.0採用註解的方式來定義實體類,通過gradle外掛生成相應的程式碼。
一,在as中匯入相關的包

compile'org.greenrobot:greendao:3.0.1'
compile'org.greenrobot:greendao-generator:3.0.0'

二,在build.gradle中進行配置:

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

三,自定義路徑

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

在gradle的根模組中加入上述程式碼,就完成了我們的基本配置了。
屬性介紹:
schemaVersion–> 指定資料庫schema版本號,遷移等操作會用到;
daoPackage –> dao的包名,包名預設是entity所在的包;
targetGenDir –> 生成資料庫檔案的目錄;

四,建立一個User的實體類

public class User {
    @Id
    private Long id;
    private String name;
    @Transient
    private int tempUsageCount; // not persisted
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Generated(hash = 873297011)
    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    @Generated(hash = 586692638)
    public User() {
    }
}

五,MakeProject

編譯專案,User實體類會自動編譯,生成get、set方法並且會在com.anye.greendao.gen目錄下生成三個檔案;
這裡寫圖片描述

 public class MyApplication extends Application {

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

    public static MyApplication instances;
    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }

    public static MyApplication getInstances(){
        return instances;
    }

    /**
     * 設定greenDao
     */
    private void setDatabase() {
        // 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 物件。
        // 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO 已經幫你做了。
        // 注意:預設的 DaoMaster.DevOpenHelper 會在資料庫升級時,刪除所有的表,意味著這將導致資料的丟失。
        // 所以,在正式的專案中,你還應該做一層封裝,來實現資料庫的安全升級。
        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        db = mHelper.getWritableDatabase();
        // 注意:該資料庫連線屬於 DaoMaster,所以多個 Session 指的是相同的資料庫連線。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }
}

在清單檔案中註冊

這裡寫圖片描述

獲取UserDao物件:
簡單的增刪改查實現:

ublic class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mAdd,mDelete,mUpdate,mFind;
    private TextView mContext;
    private User mUser;
    private UserDao mUserDao;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();

      /**  DaoSession:管理特定架構的所有可用的DAO物件,你可以使用一個getter方法獲得。daosession還提供了一些通用的永續性方法如插入、更新和刪除,重新整理載入,實體。**/ 

        mUserDao = MyApplication.getInstances().getDaoSession().getUserDao();
    }

    private void initEvent() {
        mAdd.setOnClickListener(this);
        mDelete.setOnClickListener(this);
        mUpdate.setOnClickListener(this);
        mFind.setOnClickListener(this);
    }

    private void initView() {
        mContext = (TextView) findViewById(R.id.textView);
        mAdd = (Button) findViewById(R.id.button);
        mDelete = (Button) findViewById(R.id.button2);
        mUpdate = (Button) findViewById(R.id.button3);
        mFind = (Button) findViewById(R.id.button4);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                addDate();
                break;
            case R.id.button2:
                deleteDate();
                break;
            case R.id.button3:
                updateDate();
                break;
            case R.id.button4:
                findDate();
                break;
        }
    }

    /**
     * 增加資料
     */
    private void addDate() {
        mUser = new User((long)3,"anye3");
        mUserDao.insert(mUser);//新增一個
        mContext.setText(mUser.getName());
    }

    /**
     * 刪除資料
     */
    private void deleteDate() {
        deleteUserById(2);
    }

    /**
     * 根據主鍵刪除User
     *
     * @param id User的主鍵Id
     */
    public void deleteUserById(long id) {
        mUserDao.deleteByKey(id);
    }

    /**
     * 更改資料
     */
    private void updateDate() {
        mUser = new User((long)2,"anye0803");
        mUserDao.update(mUser);
    }

    /**
     * 查詢資料
     */
    private void findDate() {
        List<User> users = mUserDao.loadAll();
        String userName = "";
        for (int i = 0; i < users.size(); i++) {
            userName += users.get(i).getName()+",";
        }
        mContext.setText("查詢全部資料==>"+userName);
    }
}

greendao中的註解

(一) @Entity 定義實體
@nameInDb 在資料庫中的名字,如不寫則為實體中類名
@indexes 索引
@createInDb 是否建立表,預設為true,false時不建立
@schema 指定架構名稱為實體
@active 無論是更新生成都重新整理
(二) @Id
(三) @NotNull 不為null
(四) @Unique 唯一約束
(五) @ToMany 一對多
(六) @OrderBy 排序
(七) @ToOne 一對一
(八) @Transient 不儲存在資料庫中
(九) @generated 由greendao產生的建構函式或方法