Android數據存儲之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.)在model的build.gradle添加如下配置
apply plugin: 'org.greenrobot.greendao'


dependencies {
    compile 'org.greenrobot:greendao:3.0.1'
}
 2.)在工程的build.gradle添加如下配置
buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}
3.)新建實體
@Entity
public class User {
    @Id
    private Long id;
    private String name;
    private int age;

   //下面省去了 setter/getter
}

此時make project會自動生成DaoMaster 、DaoSession、Dao,如圖所示 默認位置:

4.)Gradle 插件配置

比如上面想指定生成DaoMaster 、DaoSession、Dao位置,可以在model的build.gradle根目錄下加入以下配置

greendao {
    schemaVersion 1
    daoPackage 'soft.zut.edu.cn.mygreendaotest.entity'
    targetGenDir 'src/main/java'
}
  • schemaVersion: 數據庫schema版本,也可以理解為數據庫版本號
  • daoPackage:設置DaoMaster 、DaoSession、Dao包名
  • targetGenDir:設置DaoMaster 、DaoSession、Dao目錄
  • targetGenDirTest:設置生成單元測試目錄
  • generateTests:設置自動生成單元測試用例
5.)實體@Entity注解
  • schema:告知GreenDao當前實體屬於哪個schema
  • active:標記一個實體處於活動狀態,活動實體有更新、刪除和刷新方法
  • nameInDb:在數據中使用的別名,默認使用的是實體的類名
  • indexes:定義索引,可以跨越多個列
  • createInDb:標記創建數據庫表
6.)基礎屬性注解
  • @Id :主鍵 Long型,可以通過@Id(autoincrement = true)設置自增長
  • @Property:設置一個非默認關系映射所對應的列名,默認是的使用字段名 舉例:@Property (nameInDb="name")
  • @NotNul:設置數據庫表當前列不能為空
  • @Transient :添加次標記之后不會生成數據庫表的列
7.)索引注解
  • @Index:使用@Index作為一個屬性來創建一個索引,通過name設置索引別名,也可以通過unique給索引添加約束
  • @Unique:向數據庫列添加了一個唯一的約束
8.)關系注解
  • @ToOne:定義與另一個實體(一個實體對象)的關系
  • @ToMany:定義與多個實體對象的關系

GreenDao使用

 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對象:

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

簡單的增刪改查實現:

1. 增
mUser = new User((long)2,"anye3");
mUserDao.insert(mUser);//添加一個
2. 刪
mUserDao.deleteByKey(id);
3. 改
mUser = new User((long)2,"anye0803");
mUserDao.update(mUser);
4. 查
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產生的構造函數或方法

結束語

總體來說,GreenDao3.0在配置上相對於2.0要簡單的多。

但有一下幾個問題必須注意:

在網上大部分人沒有區分model的buildle.gradle和工程的buildle.gradle,將所有greendao的配置信息添加到model的buildle.gradle里面,這樣會造成一個問題,在make project會報錯

Error:Execution failed for task ':greendaotest:greendao'.
> org.eclipse.jdt.internal.compiler.impl.CompilerOptions.versionToJdkLevel(Ljava/lang/Object;)J

開始我還以為是jdk原因,上網查,也沒查出個所以然,后來參考了github上面的討論鏈接,才發現,是我把下面代碼集成搞混了,

 

 

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
開始我添加在了module的buildle.gradle里面,后來我直接移動到工程的buildle.gradle里面再,再在Build里面選中make project成功通過。

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM