热门搜索 :
考研考公
您的当前位置:首页正文

Android ORM 框架:GreenDao入门

来源:东饰资讯网

GreenDao 简介

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不在需要编写复杂的 SQL语句, 在性能方面,GreenDAO 针对 Android 进行了高度优化, 最小的内存开销 、依赖体积小 同时还是支持数据库加密。

GreenDao 特征

1、对象映射( ORM)

GreenDAO 是ORM 框架,可以非常便捷的将Java 对象映射到 SQLite 数据库中保存。

2、高性能

ORM 框架有很多,比较著名的有 OrmLite , ActiveAndroid , Realm 等,性能也不一样,下图是 GreenDao 官方给出的性能对比。


3、支持加密

GreenDao 是支持加密的,可以安全的保存用户数据。

4、轻量级

GreenDao 核心库小于100k ,所以我们并不会担心添加 GreenDao 后 APK 大小会变的是否庞大。

5、支持 protocol buffer(protobuf) 协议

GreenDao 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。

6,代码生成

greenDAO 会根据配置信息自动生成核心管理类以及 DAO 对象

7,开源

核心类介绍

DaoMaster:

使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。

DaoSession :

管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。

XxxDAO :

每个实体类 greenDAO 多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类

Entities

可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。

核心类之间的关系

集成 GreenDAO

设置仓库与插件(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
    }
}

配置依赖 ( 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'//加密库依赖(可选项)
}

配置数据库相关信息 ( Module:app build.gradle )

greendao {
    schemaVersion 1 //数据库版本号
    daoPackage 'com.speedystone.greendaodemo.db'// 设置DaoMaster、DaoSession、Dao 包名
    targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}

快速入门

我们写一个简单的实体类(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 类 。

image.png

初始化 GreenDao ( 通常初始化代码写在我们的 Application 类中)

获取 UserDao

 MyApp myApp = (MyApp) getApplication();
 DaoSession daoSession =  myApp.getDaoSession();
 UserDao userDao = daoSession.getUserDao();

保存记录

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);

删除记录

public void delete(User user){
    userDao.delete(user);
}

public void deleteByUserId(long userid){
     userDao.deleteByKey(1L);
}

更新记录

public void update(User user){
    userDao.update(user);
}

查询记录

public List<User> query(){
    return userDao.loadAll();// 查询所有记录
}

public User query2(){
        return userDao.loadByRowId(1);//根据ID查询
}

public List<User> query2(){
        return userDao.queryRaw("where AGE>?","10");//查询年龄大于10的用户
}

//查询年龄大于10的用户
public List<User> query4(){
    QueryBuilder<User> builder = userDao.queryBuilder();
    return  builder.where(UserDao.Properties.Age.gt(10)).build().list();
}

注解详解

@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;
}

@OrderBy

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

@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;
}

@ToMany

定义一对多个实体对象的关系

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

    @ToMany(referencedJoinProperty = "customerId")
    @OrderBy("date ASC")
    private List<Order> orders;
}

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

参考资料

About


Top