Android數據庫GreenDao的使用總結


一、GreenDao的介紹

GreenDAO是一個開源的Android ORM(“對象/關系映射”),通過ORM(稱為“對象/關系映射”),節省了我們在數據庫開發過程的時間!

通過GreenDao,我們可以更快速的操作數據庫,我們可以使用簡單的面相對象的API來存儲,更新,刪除和查詢Java對象。

GreenDao的優缺點?

1.  高性能

2. 易於使用的強大API,涵蓋關系和連接

3. 最小的內存消耗

4. 庫大小(<100KB)以保持較低的構建時間並避免65k方法限制

5. 數據庫加密:greenDAO支持SQLCipher,以確保用戶的數據安全;

GreenDao的核心類

GreenDao的核心類有三個:分別是DaoMaster, DaoSession, XXXDao,這三個類都會自動創建,無需自己編寫創建!

  • DaoMaster::DaoMaster保存數據庫對象並管理特定模式的DAO類。它有靜態方法來創建表或刪除它們。它的內部類OpenHelper和DevOpenHelper是SQLiteOpenHelper實現,它們在SQLite數據庫中創建模式。
  • DaoSession:管理特定模式的所有可用DAO對象,您可以使用其中一個getter方法獲取該對象。DaoSession還提供了一些通用的持久性方法,如實體的插入,加載,更新,刷新和刪除。
  • XXXDao:數據訪問對象(DAO)持久存在並查詢實體。對於每個實體,greenDAO生成DAO。它具有比DaoSession更多的持久性方法。
  • Entities :可持久化對象。通常, 實體對象代表一個數據庫行使用標准 Java 屬性(如一個POJO 或 JavaBean )。

二、GreenDao使用方法

1. 導入Gradle插件和Dao代碼生成

要在Android項目中使用GreenDao,您需要添加GreenDao Gradle插件並添加GreenDao庫:

a). 導入插件

// 在 Project的build.gradle 文件中添加:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}

b). 配置相關依賴

// 在 Moudle:app的  build.gradle 文件中添加:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

c). 配置數據庫相關信息

greendao {
    schemaVersion 1 //數據庫版本號
    daoPackage 'com.renhui.testapp.functions.database.greenDao.db'
// 設置DaoMaster、DaoSession、Dao 包名
    targetGenDir 'src.main.java'//設置DaoMaster、DaoSession、Dao目錄,請注意,這里路徑用.不要用/
    generateTests false //設置為true以自動生成單元測試。
    targetGenDirTests 'src/main/java' //應存儲生成的單元測試的基本目錄。默認為 src / androidTest / java。
}

配置完成,在Android Studio中使用Build> Make Project,重寫build項目,GreenDao集成完成!

2. 創建存儲對象實體類

使用GreenDao存儲數據只需要在存儲數據類前面聲明@Entity注解就讓GreenDao為其生成必要的代碼:

@Entity
public class Student {
    @Id(autoincrement = true)
    Long id;
    @Unique
    int studentNo;//學號
    int age; //年齡
    String telPhone;//手機號
    String sex; //性別
    String name;//姓名
    String address;//家庭住址
    String schoolName;//學校名字
    String grade;//幾年級
    ……getter and setter and constructor method……
    }

3. GreenDao初始化

我們可以在Application中維持一個全局的會話。我們在Applicaiton進行數據庫的初始化操作:=

  /**
     * 初始化GreenDao,直接在Application中進行初始化操作
     */
    private void initGreenDao() {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db");
        SQLiteDatabase db = helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
    }
    
    private DaoSession daoSession;
    public DaoSession getDaoSession() {
        return daoSession;
    }

初始化完成之后重新rebuild一下項目會發現在設置的targetGenDir的目錄生成三個類文件,這個是GreenDao自動生成的!說明數據庫已經連接好了,咱們接下來只需要進行數據庫的增刪改查操作就行了。

4. 使用GreenDao實現增刪改查

1. 增

insert() 插入數據

@Override
public void insertData(Thing s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    for (int i = 0; i < 1000; i++) {
        Student student = new Student();
        student.setStudentNo(i);
        int age = mRandom.nextInt(10) + 10;
        student.setAge(age);
        student.setTelPhone(RandomValue.getTel());
        String chineseName = RandomValue.getChineseName();
        student.setName(chineseName);
        if (i % 2 == 0) {
            student.setSex("男");
        } else {
            student.setSex("女");
        }
        student.setAddress(RandomValue.getRoad());
        student.setGrade(String.valueOf(age % 10) + "年紀");
        student.setSchoolName(RandomValue.getSchoolName());
        daoSession.insert(student);
    }
} 

insertOrReplace()數據存在則替換,數據不存在則插入

@Override
public void insertData(Thing s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    for (int i = 0; i < 1000; i++) {
        Student student = new Student();
        student.setStudentNo(i);
        int age = mRandom.nextInt(10) + 10;
        student.setAge(age);
        student.setTelPhone(RandomValue.getTel());
        String chineseName = RandomValue.getChineseName();
        student.setName(chineseName);
        if (i % 2 == 0) {
            student.setSex("男");
        } else {
            student.setSex("女");
        }
        student.setAddress(RandomValue.getRoad());
        student.setGrade(String.valueOf(age % 10) + "年紀");
        student.setSchoolName(RandomValue.getSchoolName());
        daoSession.insertOrReplace(student);//插入或替換
    }
} 

2. 刪

刪除有兩種方式:delete()和deleteAll();分別表示刪除單個和刪除所有。

 @Override
 public void deleteData(Student s) {
     DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
     daoSession.delete(s);
 }

 @Override
 public void deleteAll() {
     DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
     daoSession.deleteAll(Student.class);
 }

3. 改

通過update來進行修改:

@Override
public void updataData(Student s) {
    DaoSession daoSession = ((AserbaoApplication) getApplication()).getDaoSession();
    daoSession.update(s);
}

4. 查

查詢的方法有:

  • loadAll():查詢所有數據。
  • queryRaw():根據條件查詢。
  • queryBuilder() : 方便查詢的創建,后面詳細講解。
public List queryAll() {
    List<Student> students = daoSession.loadAll(Student.class);
    return students;
}

@Override
public void queryData(String s) {
    List<Student> students = daoSession.queryRaw(Student.class, " where id = ?", s);
    mDataBaseAdapter.addNewStudentData(students);
}

 

 


參考資料: https://www.jianshu.com/p/53083f782ea2


 


免責聲明!

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



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