小工具知识网

当前位置: 首页 > 行业知识 > Android ORM 框架之 greenDAO

行业知识

Android ORM 框架之 greenDAO

2026-11-07 13:50:26 来源:互联网转载

Android ORM 框架之 greenDAO

  • 官网地址
  • GitHub地址
  • greenDAO 描述
  • greenDAO 特点
  • greenDAO 核心类
    • DaoMaster
    • DaoSession
    • DAO
    • 实体
    • 使用 greenDAO
      • 将 greenDAO 插件添加到项目中
      • 创建实体
        • 实体常用注解
        • 初始化 DaoSession
        • 操作数据(CRUD)

          官网地址

          GitHub地址

          greenDAO 描述

          greenDAO 是一个轻量且快速的 Android ORM,可将对象映射到 SQLite 数据库,

          greenDAO 针对 Android 进行了高度优化,可提供出色的性能并消耗最少的内存。

          ORM: 对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。是一个可在编程语言里使用的——“虚拟对象数据库”。

          greenDAO 特点

          • 体积小:小于100KB,以保持较低的构建时间并避免65k方法限制
          • 简单:简洁直接易于使用的API,V3带注释
          • 高性能:可能是 Android 最快的 ORM,由智能代码生成驱动
          • 强大的联接:跨实体查询,甚至对复杂关系进行链式联接
          • 灵活的属性类型:使用自定义类或枚举来表示实体中的数据
          • 数据库加密:greenDAO支持SQLCipher来保证用户数据的安全
          • 安全且富有表现力的查询 API:QueryBuilder 使用属性常量来避免拼写错误
          • 稳定:greenDAO 自 2011 年以来一直存在并被无数著名应用程序使用(GitHub 12k+ stars)

            greenDAO 核心类

            DaoMaster

            • 官方释义:使用 greenDAO 的入口点。DaoMaster 持有数据库对象(SQLiteDatabase)并管理特定模式的 DAO 类(而不是对象)。它有静态方法来创建或删除表。它的内部类 OpenHelper 和 DevOpenHelper 是 SQLiteOpenHelper 实现,用于在 SQLite 数据库中创建架构。
            • 我的理解:创建数据库的框架。DaoMaster 做了createAllTables dropAllTables的操作;其内部类 OpenHelper 初始化时调用了 DaoMaster 的 createAllTables 方法、内部类 DevOpenHelper 在数据库升级时调用了 DaoMaster 的 dropAllTables 方法;

              DaoSession

              • 官方释义:管理特定模式的所有可用 DAO 对象,您可以使用其中一种 getter 方法获取这些对象。DaoSession 还提供了一些通用的持久化方法,如实体的插入、加载、更新、刷新和删除。最后,DaoSession 对象还跟踪身份范围。
              • 我的理解:获取各个实体对应的 DAO 对象、操作具体的 DAO 对象(初始化、注册、清除缓存数据(GreenDao默认开启了缓存));

                DAO

                • 官方释义:数据访问对象(DAO)持续存在并查询实体。对于每个实体,greenDAO 都会生成一个 DAO。它比 DaoSession 有更多的持久化方法,例如:count、loadAll 和 insertInTx。
                • 我的理解:对应实际生成的实体类。Dao 类中包含了 实体的属性以及 queryBuilde 的引用列名、createTable 时的SQL语句、dropTable 时的SQL语句、get 实体属性值到语句、将光标当前位置值 set 到实体属性中,有更多的方法来操作数据库元素;

                  实体

                  • 官方释义:持久化对象。通常,实体是使用标准 Java 属性(如 POJO 或 JavaBean)表示数据库行的对象。
                  • 我的理解:就是使用了 @Entity 注解的类对象;

                    使用 greenDAO

                    将 greenDAO 插件添加到项目中

                    1. 将以下 gradle 配置添加到 Android 项目的根 build.gradle 文件中
                    buildscript {    repositories {        mavenCentral()    }    dependencies {        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.1'    }}
                    1. 将以下 gradle 配置添加到 应用程序模块的 build.gradle 文件中
                    plugins {    id 'org.greenrobot.greendao'} dependencies {    implementation 'org.greenrobot:greendao:3.3.0'}// 配置 greendao 参数greendao {    schemaVersion 1 // 数据库当前版本    targetGenDir 'src/main/java' // 生成数据库文件的目录    daoPackage "com.example.model" // 生成的 DAO、DaoMaster 和 DaoSession 的包名称(默认为源实体的包名称)    // generateTests 设为 true 以自动生成单元测试    // targetGenDirTests 生成的单元测试应存储的目录(默认为 src/androidTest/java)}
                    1. 点击 Sync Project with Gradle Files 引入即可

                    创建实体

                    package top.gaojc.app.bean;import org.greenrobot.greendao.annotation.Entity;import org.greenrobot.greendao.annotation.Id;import org.greenrobot.greendao.annotation.Index;import org.greenrobot.greendao.annotation.NotNull;@Entitypublic class UserBean {    @Id    @Index    private long studentId;    @NotNull    private String name;    @NotNull    private int age;}

                    写完实体类需 Make Project 重新编译项目,它会生成 DaoMaster、DaoSession 和 实体Dao 等类

                    实体常用注解

                    @Entity:将 Java 类转换为数据库支持的实体。指示 greenDAO 生成代码(例如 UserBeanDao)    @Entity()括号内可加入更详细的设置,如:      nameInDb = "TABLE_NAME" ——> 声明该表的表名,默认取类名      createInDb = true ——> 是否创建表,默认为true      generateConstructors = true ——> 是否生成含所有参数的构造函数,默认为true      generateGettersSetters = true ——> 是否生成getter/setter,默认为true@Id:选择一个long / Long属性作为实体ID,主键    @Id()括号可加入 autoincrement = true 表明自增长@NotNull:表示该字段不可以为空@Transient:该注解表示这个属性将不会作为数据表中的一个字段@Index:可以为相应的数据库列创建数据库索引@Unique:向数据库列添加 UNIQUE 约束,表示该字段唯一@Generated:由 greendao 生成的构造函数或方法@Property:表示该属性将作为表的一个字段    @Property(nameInDb = "NAME") 用来声明其变量在表中的实际字段名为 NAME@OrderBy:排序@Keep:指定在下次运行 greenDAO 生成过程中应保留目标,在Entity类本身上使用此注释将禁用任何类修改@ToOne:一对一@ToMany:一对多

                    初始化 DaoSession

                    package top.gaojc.app;import android.app.Application;import android.database.sqlite.SQLiteDatabase;import top.gaojc.app.greenDao.DaoMaster;import top.gaojc.app.greenDao.DaoSession;// 创建一个 application 类继承 Application,在此完成 DaoSession 的初始化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;    }    private void setDatabase() {        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失(可创建临时表迁移数据)        // 此处 user_db 表示数据库名称        mHelper = new DaoMaster.DevOpenHelper(this, "user_db", null);        db = mHelper.getWritableDatabase();        mDaoMaster = new DaoMaster(db);        mDaoSession = mDaoMaster.newSession();    }    public DaoSession getDaoSession() {        return mDaoSession;    }    public SQLiteDatabase getDb() {        return db;    }}

                    操作数据(CRUD)

                    package top.gaojc.app.utils;import java.util.List;import top.gaojc.app.MyApplication;import top.gaojc.app.bean.UserBean;import top.gaojc.app.greenDao.UserBeanDao;public class DataUtil {    // 增    private void insertData(UserBean user) {        MyApplication.getInstances().getDaoSession().getUserBeanDao().insert(user);    }    // 删    private void deleteData(Long id){        MyApplication.getInstances().getDaoSession().getUserBeanDao().deleteByKey(id);    }    // 改    private void updateData(UserBean user) {        MyApplication.getInstances().getDaoSession().getUserBeanDao().update(user);    }    // 查    private void queryData() {        List allUsers = MyApplication.getInstances().getDaoSession().getUserBeanDao().loadAll(); // 查询所有数据        List users = MyApplication.getInstances().getDaoSession().getUserBeanDao().queryBuilder().where(UserBeanDao.Properties.Name.eq("张三")).list(); // 根据姓名查找    }}

上一篇:宝塔面板启动ThinkPHP程序的详细步骤指南

下一篇:ps5服务器怎么登?