Android資料存放區之GreenDao 3.0 詳解(一),androidgreendao

來源:互聯網
上載者:User

Android資料存放區之GreenDao 3.0 詳解(一),androidgreendao
前言:

 今天一大早收到GreenDao 3.0 正式發布的訊息,自從2014年接觸GreenDao至今,項目中一直使用GreenDao架構處理資料庫操作,本人使用資料庫路線 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙著公司的項目需求,只能晚上加班來學習最新的GreenDao 3.0使用方式了。

GreenDao 介紹:

    greenDAO是一個對象關係映射(ORM)的架構,能夠提供一個介面通過操作對象的方式去操作關係型資料庫,它能夠讓你操作資料庫時更簡單、更方便。如所示:

官網地址:http://greenrobot.org/greendao/

github:https://github.com/greenrobot/greenDAO

GreenDao 優點:
  • 效能高,號稱Android最快的關係型資料庫

  • 記憶體佔用小
  • 庫檔案比較小,小於100K,編譯時間低,而且可以避免65K方法限制

  • 支援資料庫加密  greendao支援SQLCipher進行資料庫加密 有關SQLCipher可以參考這篇部落格Android資料存放區之Sqlite採用SQLCipher資料庫加密實戰

  • 簡潔易用的API
GreenDao 3.0改動:

   使用過GreenDao的同學都知道,3.0之前需要通過建立GreenDaoGenerator工程產生Java資料對象(實體)和DAO對象,非常的繁瑣而且也加大了使用成本。

GreenDao  3.0最大的變化就是採用註解的方式通過編譯方式產生Java資料對象和DAO對象。

GreenDao 3.0使用方式: 1.)在build.gradle添加如下配置
buildscript {    repositories {        mavenCentral()    }    dependencies {        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'    }}apply plugin: 'org.greenrobot.greendao'dependencies {    compile 'org.greenrobot:greendao:3.0.1'}
2.)建立實體
@Entitypublic class User {    @Id    private long id;    private String name;    private int age;   //下面省去了 setter/getter}

此時編譯一下自動產生DaoMaster 、DaoSession、Dao, 預設位置:

3.)Gradle 外掛程式配置

比如上面想指定產生DaoMaster 、DaoSession、Dao位置

greendao {    targetGenDir 'src/main/java'}
  • schemaVersion: 資料庫schema版本,也可以理解為資料庫版本號碼
  • daoPackage:設定DaoMaster 、DaoSession、Dao包名
  • targetGenDir:設定DaoMaster 、DaoSession、Dao目錄
  • targetGenDirTest:設定產生單元測試目錄
  • generateTests:設定自動產生單元測試用例
4.)實體@Entity註解
  • schema:告知GreenDao當前實體屬於哪個schema
  • active:標記一個實體處於活動狀態,活動實體有更新、刪除和重新整理方法
  • nameInDb:在資料中使用的別名,預設使用的是實體的類名
  • indexes:定義索引,可以跨越多個列
  • createInDb:標記建立資料庫表
5.)基礎屬性註解
  • @Id :主鍵 long/Long型,可以通過@Id(autoincrement = true)設定自增長
  • @Property:設定一個非預設關係映射所對應的列名,預設是的使用欄位名 舉例:@Property (nameInDb="name")
  • @NotNul:設定資料庫表當前列不可為空
  • @Transient :添加次標記之後不會產生資料庫表的列
6.)索引註解
  • @Index:使用@Index作為一個屬性來建立一個索引,通過name設定索引別名,也可以通過unique給索引添加約束
  • @Unique:向資料庫列添加了一個唯一的約束
7.)關係註解
  • @ToOne:定義與另一個實體(一個實體物件)的關係
  • @ToMany:定義與多個實體物件的關係
GreenDao 3.0簡單實戰:      1.)通過上面使用方式我們可以擷取DaoMaster 、DaoSession、Dao類

 這裡聲明一個資料庫管理者單例

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;    }}
2.)擷取可讀可寫資料庫

  可讀資料庫

  /**     * 擷取可讀資料庫     */    private SQLiteDatabase getReadableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);        }        SQLiteDatabase db = openHelper.getReadableDatabase();        return db;    }

   可寫資料庫

    /**     * 擷取可寫資料庫     */    private SQLiteDatabase getWritableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);        }        SQLiteDatabase db = openHelper.getWritableDatabase();        return db;    }
3.)插入資料
 /**     * 插入一條記錄     *     * @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);    }
4.)刪除資料
 /**     * 刪除一條記錄     *     * @param user     */    public void deleteUser(User user) {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        userDao.delete(user);    }
5.)更新資料
 /**     * 更新一條記錄     *     * @param user     */    public void updateUser(User user) {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        userDao.update(user);    }
6.)查詢資料
  /**     * 查詢使用者列表     */    public List<User> queryUserList() {        DaoMaster daoMaster = new DaoMaster(getReadableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        QueryBuilder<User> qb = userDao.queryBuilder();        List<User> list = qb.list();        return 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);        List<User> list = qb.list();        return list;    }
7.)測試程式
 DBManager dbManager = DBManager.getInstance(this);        for (int i = 0; i < 5; i++) {            User user = new User();            user.setId(i);            user.setAge(i * 3);            user.setName("第" + i + "人");            dbManager.insertUser(user);        }        List<User> userList = dbManager.queryUserList();        for (User user : userList) {            Log.e("TAG", "queryUserList--before-->" + user.getId() + "--" + user.getName() +"--"+user.getAge());            if (user.getId() == 0) {                dbManager.deleteUser(user);            }            if (user.getId() == 3) {                user.setAge(10);                dbManager.updateUser(user);            }        }        userList = dbManager.queryUserList();        for (User user : userList) {            Log.e("TAG", "queryUserList--after--->" + user.getId() + "---" + user.getName()+"--"+user.getAge());        }

運行結果

 

總結:

   本文主要介紹了GreenDao 3.0使用註解的情況,以及實現了簡單的增刪改查,接下來會更一步學習GreenDao更為複雜的使用的方式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.