Android ORM 框架:GreenDao 使用詳解(基礎篇)

轉載務必保留如下信息:
本文做者:speedy
CSDN 專欄:blog.csdn.net/speedystone
掘金專欄:juejin.im/user/57e082…java

1、GreenDao 簡介

greenDAO 是一款開源的面向 Android 的輕便、快捷的 ORM 框架,將 Java 對象映射到 SQLite 數據庫中,咱們操做數據庫的時候,不在須要編寫複雜的 SQL語句, 在性能方面,greenDAO 針對 Android 進行了高度優化, 最小的內存開銷 、依賴體積小 同時仍是支持數據庫加密。android

greenDAO 官網地址:greenrobot.org/greendao/git


2、GreenDao 特徵:

一、對象映射( ORM)github

greenDAO 是ORM 框架,能夠很是便捷的將Java 對象映射到 SQLite 數據庫中保存。sql

二、高性能數據庫

ORM 框架有不少,比較著名的有 OrmLite , ActiveAndroid 等,性能也不同,下圖是 GreenDao 官方給出的性能對比。安全

三、支持加密服務器

GreenDao 是支持加密的,能夠安全的保存用戶數據。app

四、輕量級框架

GreenDao 核心庫小於100k ,因此咱們並不會擔憂添加 GreenDao 後 APK 大小會變的是否龐大。

五、支持 protocol buffer(protobuf) 協議

GreenDao 支持 protocol buffer(protobuf) 協議數據的直接存儲,若是你經過 protobuf 協議與服務器交互,將不須要任何的映射。

6,代碼生成

greenDAO 會根據配置信息自動生成核心管理類以及 DAO 對象

7,開源

greenDAO 是開源的,咱們能夠在github 上下載源碼,學習。github 地址:github.com/greenrobot/…


3、核心類介紹

DaoMaster:

使用 greenDAO 的入口點。DaoMaster 負責管理數據庫對象(SQLiteDatabase)和 DAO 類(對象),咱們能夠經過它內部類 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 建立不一樣模式的 SQLite 數據庫。

DaoSession :

管理指定模式下的全部 DAO 對象,DaoSession提供了一些通用的持久性方法好比插入、負載、更新、更新和刪除實體。

XxxDAO :

每一個實體類 greenDAO 多會生成一個與之對應DAO對象,如:User 實體,則會生成一個一個UserDao 類

Entities

可持久化對象。一般, 實體對象表明一個數據庫行使用標準 Java 屬性(如一個POJO 或 JavaBean )。

核心類之間的關係


4、 集成 GreenDAO

a、設置倉庫與插件(Project: build.gradle)

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}複製代碼

b、 配置依賴 ( Module:app build.gradle )

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library

    // This is only needed if you want to use encrypted databases
    compile 'net.zetetic:android-database-sqlcipher:3.5.6'//加密庫依賴(可選項)
}複製代碼

c、 配置數據庫相關信息 ( Module:app build.gradle )

greendao {
    schemaVersion 1 //數據庫版本號
    daoPackage 'com.speedystone.greendaodemo.db'// 設置DaoMaster、DaoSession、Dao 包名
    targetGenDir 'src/main/java'//設置DaoMaster、DaoSession、Dao目錄
}複製代碼

d、點擊 : Sync Project with Gradle Files 按鈕,同步一下工程 , 配置完成

5、快速入門

1, 咱們寫一個簡單的實體類(User),測試一下

package com.speedystone.greendaodemo.model;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;

/**
 * Created by Speedy on 2017/6/30.
 */
@Entity
public class User {

    @Id
    private long id;

    private String name;

    private int age;

    //此處省略了getter,setter 方法
}複製代碼

二、點擊 Make Project(或者 Make Moudle 'App') 編譯一下工程 。若是配置正確,會在配置的包目錄下自動會生成 DaoMaster,DaoSession 和 UserDao 類 。

3,初始化 GreenDao ( 一般初始化代碼寫在咱們的 Application 類中)

4,獲取 UserDao

MyApp myApp = (MyApp) getApplication();
  DaoSession daoSession =  myApp.getDaoSession();
  UserDao userDao = daoSession.getUserDao();複製代碼

5, 保存記錄

User user = new User();
 user.setUserId(1);
 user.setName("小明");
 user.setAge(16);

  userDao.insert(user);複製代碼
User user = new User();
 user.setUserId(1);
 user.setName("小明");
 user.setAge(16);

 //插入或者替換
 userDao.insertOrReplace(user);複製代碼

5, 刪除記錄

public void delete(User user){
    userDao.delete(user);
}複製代碼

或者

public void deleteByUserId(long userid){
     userDao.deleteByKey(1L);
}複製代碼

6,更新記錄

public void update(User user){
    userDao.update(user);
}複製代碼

7,查詢記錄

public List
  
  
  

 
  
  query(){ return userDao.loadAll();// 查詢全部記錄 } 

 複製代碼
public User query2(){
        return userDao.loadByRowId(1);//根據ID查詢
}複製代碼
public List
  
  
  

 
  
  query2(){ return userDao.queryRaw("where AGE>?","10");//查詢年齡大於10的用戶 } 

 複製代碼
//查詢年齡大於10的用戶
public List
  
  
  

 
  
  query4(){ QueryBuilder 
 
  
    builder = userDao.queryBuilder(); return builder.where(UserDao.Properties.Age.gt(10)).build().list(); } 
   

 複製代碼

6、註解詳解

@Entity

代表這個實體類會在數據庫中生成一個與之相對應的表

屬性:

  • schema:告知GreenDao當前實體屬於哪一個 schema
  • schema active:標記一個實體處於活躍狀態,活動實體有更新、刪除和刷新方法
  • nameInDb:在數據庫中使用的別名,默認使用的是實體的類名,
  • indexes:定義索引,能夠跨越多個列
  • createInDb:標記建立數據庫表(默認:true)
  • generateConstructors 自動建立全參構造方法(同時會生成一個無參構造方法)(默認:true)
  • generateGettersSetters 自動生成 getters and setters 方法(默認:true)
@Entity(
        schema = "myschema",
        active = true,
        nameInDb = "AWESOME_USERS",
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
        createInDb = true,
        generateConstructors = false,
        generateGettersSetters = true
)
public class User {
  ...
}複製代碼

@Id

對應數據表中的 Id 字段

@Index

使用@Index做爲一個屬性來建立一個索引,默認是使用字段名

@Entity
public class User {
    @Id 
    private Long id;

    @Index(unique = true)
    private String name;
}複製代碼

@Property

設置一個非默認關係映射所對應的列名,默認是使用字段名,例如:@Property(nameInDb = "userName")

@NotNull

設置數據庫表當前列不能爲空

@Transient

添加此標記後不會生成數據庫表的列

@Unique

表名該屬性在數據庫中只能有惟一值

@Entity
public class User {
    @Id 
    private Long id;
    @Unique
    private String name;
}複製代碼

@ToOne

表示一對一關係

@Entity
public class Order {

    @Id private Long id;

    private long customerId;

    @ToOne(joinProperty = "customerId")
    private Customer customer;
}

@Entity
public class Customer {
    @Id 
    private Long id;
}複製代碼

@OrderBy

更加某一字段排序 ,例如:@OrderBy("date ASC")

@ToMany

定義一對多個實體對象的關係

@Entity
public class Customer {
    @Id private Long id;

    @ToMany(referencedJoinProperty = "customerId")
    @OrderBy("date ASC")
    private List
  
  
  

 
  
  orders; } @Entity public class Order { @Id private Long id; private Date date; private long customerId; } 

 複製代碼

相關文章
相關標籤/搜索