Android ORM 框架之 greenDAO

简介: Android ORM 框架之 greenDAO

官网地址

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;

@Entity
public 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<UserBean> allUsers = MyApplication.getInstances().getDaoSession().getUserBeanDao().loadAll(); // 查询所有数据
        List<UserBean> users = MyApplication.getInstances().getDaoSession().getUserBeanDao().queryBuilder().where(UserBeanDao.Properties.Name.eq("张三")).list(); // 根据姓名查找
    }

}
目录
相关文章
|
3月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
4月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
14天前
|
算法 JavaScript Android开发
|
23天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
90 1
|
2月前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
346 3
|
2月前
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
77 8
|
3月前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
3月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
如何使用Amlogic T972安卓9.0系统上的misc框架来简化驱动程序开发,通过misc框架自动分配设备号并创建设备文件,从而减少代码量并避免设备号冲突。
44 0
基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
|
3月前
|
存储 前端开发 Java
Android MVVM框架详解与应用
在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细介绍Android MVVM框架的基本概念、优势、实现流程以及一个实际案例。
103 0
|
4月前
|
前端开发 安全 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
【7月更文挑战第28天】在Android开发领域,五大框架如星辰般指引方向,加速进程,提升应用品质。1. **Retrofit**:Square公司的类型安全HTTP客户端,使网络请求变得优雅简洁。2. **Room**:Google推荐的ORM库,简化SQLite数据库访问。3. **MVVM**:一种架构模式,提高代码可维护性和扩展性。4. **Dagger 2**:依赖注入框架,减少样板代码,以声明方式管理依赖。5. **Jetpack Compose**:全新的UI工具包,采用声明式UI编程,让UI开发更直观高效。掌握这些框架,能有效应对Android开发挑战,助力打造爆款应用。
251 0