Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android數據存儲之GreenDao 3.0 詳解(一),androidgreendao

Android數據存儲之GreenDao 3.0 詳解(一),androidgreendao

編輯:關於android開發

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.)新建實體
@Entity
public 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更為復雜的使用的方式。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved