杰瑞科技汇

GreenDao如何快速上手?核心步骤有哪些?

目录

  1. 简介:什么是 GreenDao,它有什么优点?
  2. 环境搭建:在 Android Studio 中集成 GreenDao。
  3. 创建实体类:定义你的数据模型。
  4. 生成代码:一键生成 Dao 相关代码。
  5. 初始化:在 Application 中初始化 GreenDao。
  6. 核心操作:增、删、改、查。
  7. 高级查询:使用 QueryBuilder 构建复杂查询。
  8. 实体注解详解:配置实体类属性。
  9. 最佳实践:如何优雅地使用 GreenDao。

简介

GreenDao 是一个开源的、轻量级的、快速的 Android ORM(Object Relational Mapping,对象关系映射)框架,它将 Java 对象映射到 SQLite 数据库,让你可以像操作普通 Java 对象一样操作数据库,而无需编写繁琐的 SQL 语句。

主要优点:

  • 高性能:GreenDao 是目前 Android 平台最快的 ORM 框架之一。
  • 低内存消耗:经过精心优化,内存占用非常低。
  • 易于使用:通过注解定义实体,代码生成器自动创建所有 Dao 代码。
  • 强大的功能:支持实体关系(一对一、一对多、多对多)、缓存、加密等高级特性。

环境搭建

1 添加 GreenDao 插件

在项目根目录的 build.gradle 文件中,添加 GreenDao 的代码生成插件。

// build.gradle (Project: YourProject)
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // ... 其他依赖
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 使用最新版本
    }
}

2 在 App 模块的 build.gradle 中应用插件

在你的 App 模块的 build.gradle 文件中,应用插件并配置 GreenDao 的相关信息。

// build.gradle (Module: app)
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // 应用 GreenDao 插件
android {
    // ... 其他配置
}
dependencies {
    // ... 其他依赖
    implementation 'org.greenrobot:greendao:3.3.0' // GreenDao 核心库
}
// GreenDao 配置
greendao {
    // 指定数据库 schema 版本号,迁移等操作会用到
    schemaVersion 1
    // 指定 GreenDao 生成的代码目录,默认是 build/generated/source/greendao
    // 通常我们放在 src/main/java 下,方便访问
    daoPackage 'com.yourpackage.dao' 
    // 将生成的代码目录设置为 src/main/java,这样代码会自动合并到项目中
    targetGenDir 'src/main/java'
}

配置完成后,点击 "Sync Now" 同步项目,这时,你的项目结构中还没有任何实体相关的代码,但插件已经准备就绪。


创建实体类

实体类就是你要存储在数据库中的 Java 对象,它必须是一个 POJO(Plain Old Java Object),我们以一个 User 实体为例。

src/main/java 下创建一个实体类,User.java

package com.yourpackage.entity;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Generated;
@Entity // 必须使用 @Entity 注解标记这是一个实体
public class User {
    // @Id: 标记为主键,autoincrement = true 表示自增长
    @Id(autoincrement = true)
    private Long id;
    // @Property: 可以指定数据库列名,如果不指定,默认使用属性名
    @Property(nameInDb = "USERNAME")
    private String name;
    private int age;
    // 必须提供一个无参的构造函数
    public User() {
    }
    // 可以有带参的构造函数
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // Getter 和 Setter 方法
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    // @Generated: GreenDao 会自动生成此代码,不要手动修改或删除
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

关键注解说明:

  • @Entity: 声明这是一个 GreenDao 实体。
  • @Id: 标记为主键。autoincrement = true 表示自增长。
  • @Property(nameInDb = "..."): 指定在数据库中的列名,如果不写,默认使用 Java 属性名。
  • @Generated: GreenDao 代码生成器会在此处生成代码,请勿手动修改。

生成代码

完成实体类的定义后,最神奇的一步来了,点击 Android Studio 菜单栏的 Build -> Rebuild Project

构建完成后,你会发现在你之前配置的 daoPackage 路径下(com.yourpackage.dao),自动生成了三个文件:

  1. DaoMaster.java: 数据库版本管理、创建和删除等核心操作。
  2. DaoSession.java: 管理所有的 Dao 对象,是操作数据库的入口。
  3. UserDao.java: 针对 User 实体的增、删、改、查等具体操作方法。

这些文件就是 GreenDao 的核心,你只需要在代码中调用它们即可。千万不要手动修改这些生成的文件!

GreenDao如何快速上手?核心步骤有哪些?-图1


初始化

为了在整个应用中复用数据库连接,我们通常在 Application 类中进行初始化。

1 创建 Application 类

package com.yourpackage;
import android.app.Application;
import com.yourpackage.dao.DaoMaster;
import com.yourpackage.dao.DaoSession;
public class MyApplication extends Application {
    private DaoSession daoSession;
    @Override
    public void onCreate() {
        super.onCreate();
        setupDatabase();
    }
    private void setupDatabase() {
        // 创建一个 DevOpenHelper,数据库文件会自动创建在 /data/data/<包名>/databases/ 目录下
        // 数据库名为 "notes-db"
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db");
        DaoMaster daoMaster = new DaoMaster(helper.getWritableDatabase());
        daoSession = daoMaster.newSession();
    }
    public DaoSession getDaoSession() {
        return daoSession;
    }
}

2 在 AndroidManifest.xml 中注册 Application

<application
    android:name=".MyApplication"
    ... >
    ...
</application>

数据库的初始化就完成了,你可以在任何 Activity 或 Service 中通过 ((MyApplication) getApplication()).getDaoSession() 获取到 DaoSession 对象。


核心操作

假设我们在一个 Activity 中进行操作:

// 获取 DaoSession
DaoSession daoSession = ((MyApplication) getApplication()).getDaoSession();
// 获取 User 的 Dao 对象
UserDao userDao = daoSession.getUserDao();

增 - 插入数据

// 创建一个 User 对象
User user1 = new User("Alice", 25);
User user2 = new User("Bob", 30);
// 插入数据
// insert() 会返回新插入行的 ID
long id1 = userDao.insert(user1);
long id2 = userDao.insert(user2);
Log.d("GreenDao", "Inserted user with id: " + id1);

删 - 删除数据

// 方式一:根据对象删除
// 先查询出要删除的对象
User userToDelete = userDao.queryBuilder().where(UserDao.Properties.Name.eq("Bob")).unique();
if (userToDelete != null) {
    userDao.delete(userToDelete);
}
// 方式二:根据 ID 删除
userDao.deleteByKey(1L); // 删除 id 为 1 的用户

改 - 更新数据

// 先查询出要更新的对象
User userToUpdate = userDao.queryBuilder().where(UserDao.Properties.Name.eq("Alice")).unique();
if (userToUpdate != null) {
    // 修改对象的属性
    userToUpdate.setAge(26);
    // 更新数据库
    userDao.update(userToUpdate);
}

查 - 查询数据

GreenDao 提供了多种查询方式,最常用的是 QueryBuilder

// 1. 查询所有用户
List<User> allUsers = userDao.loadAll(); // 或 userDao.queryBuilder().list();
Log.d("GreenDao", "All users: " + allUsers);
// 2. 根据条件查询单个用户
User alice = userDao.queryBuilder().where(UserDao.Properties.Name.eq("Alice")).unique();
Log.d("GreenDao", "Found Alice: " + alice);
// 3. 根据条件查询多个用户
List<User> usersOver25 = userDao.queryBuilder()
        .where(UserDao.Properties.Age.gt(25)) // 大于 25
        .orderDesc(UserDao.Properties.Age)   // 按年龄降序排列
        .list();
Log.d("GreenDao", "Users over 25: " + usersOver25);
// 4. 根据ID查询
User userById = userDao.load(1L);
Log.d("GreenDao", "User with id 1: " + userById);

高级查询 - QueryBuilder

QueryBuilder 是 GreenDao 强大功能的核心,它允许你通过链式调用的方式构建复杂的 SQL 查询。

常用方法:

  • .where(...): 设置 WHERE 条件,可以使用 and(), or(), not() 组合。
  • .orderAsc(...) / .orderDesc(...): 设置排序。
  • .limit(...): 限制返回结果的数量。
  • .offset(...): 设置偏移量,用于分页。
  • .unique(): 查询唯一结果,如果结果不唯一会抛出异常。
  • .list(): 查询结果列表。

示例:查询名字以 "A" 开头且年龄在 20 到 30 之间的用户,按年龄升序排列,只返回第一个。

List<User> result = userDao.queryBuilder()
        .where(
            UserDao.Properties.Name.like("A%"), // like 是模糊查询
            UserDao.Properties.Age.between(20, 30) // between 是范围查询
        )
        .orderAsc(UserDao.Properties.Age)
        .limit(1)
        .list();
Log.d("GreenDao", "Query result: " + result);

实体注解详解

除了基本的 @Entity, @Id, @Property,GreenDao 还提供了更多有用的注解:

注解 说明 示例
@Entity 标记类为实体 @Entity
@Id 标记主键 @Id(autoincrement = true)
@Property 指定数据库列名 @Property(nameInDb = "user_name")
@NotNull 列值不能为 NULL @NotNull private String name;
@Transient 标记此字段不存入数据库 @Transient private String tempInfo;
@Index 为该列创建索引,提高查询速度 @Index(unique = true) private String email;
@Unique 值必须唯一,底层会创建唯一索引 @Unique private String username;
@Generated 标记由代码生成器生成,不要修改 @Generated

最佳实践

  1. 使用 Application 初始化:如前所述,在 Application 类中初始化 DaoSession,避免重复创建数据库连接。
  2. 异步操作:数据库操作是 I/O 密集型任务,如果在主线程(UI 线程)执行,会导致应用卡顿甚至 ANR,GreenDao 提供了异步 API:
    userDao.insertOrReplaceInTx(user); // 同步事务
    userDao.insertOrReplaceAsync(user).listenForTx(); // 异步事务

    对于大量数据操作,推荐使用 InTx 方法,它会在一个事务中完成,效率更高。

  3. 合理使用索引:对于经常作为查询条件的字段(如用户名、邮箱),使用 @Index@Unique 注解创建索引,可以极大地提升查询速度。
  4. 数据迁移:当 schemaVersion 改变时,GreenDao 会触发迁移,你需要实现 DaoMaster.OpenHelperonUpgrade 方法来处理数据库结构的变更,这是一个比较复杂的话题,对于简单应用,可以直接删除旧数据库,让 GreenDao 重新创建。

GreenDao 是一个非常优秀的本地数据库解决方案,它通过简单的注解和代码生成,将复杂的 SQLite 操作变得异常简单,本教程涵盖了从入门到进阶的主要内容,掌握了这些,你就可以在项目中高效地使用 GreenDao 了。

核心回顾:

  1. 配置插件:在 build.gradle 中添加 GreenDao 插件和依赖。
  2. 定义实体:用 @Entity 等注解标记你的 Java 类。
  3. 生成代码Build -> Rebuild Project
  4. 初始化:在 Application 中创建 DaoMasterDaoSession
  5. 操作数据:通过 DaoSession 获取具体的 Dao 对象,调用其 insert, delete, update, query 等方法。

希望这份教程对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇