目录
- 简介:什么是 GreenDao,它有什么优点?
- 环境搭建:在 Android Studio 中集成 GreenDao。
- 创建实体类:定义你的数据模型。
- 生成代码:一键生成 Dao 相关代码。
- 初始化:在 Application 中初始化 GreenDao。
- 核心操作:增、删、改、查。
- 高级查询:使用 QueryBuilder 构建复杂查询。
- 实体注解详解:配置实体类属性。
- 最佳实践:如何优雅地使用 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),自动生成了三个文件:
DaoMaster.java: 数据库版本管理、创建和删除等核心操作。DaoSession.java: 管理所有的 Dao 对象,是操作数据库的入口。UserDao.java: 针对User实体的增、删、改、查等具体操作方法。
这些文件就是 GreenDao 的核心,你只需要在代码中调用它们即可。千万不要手动修改这些生成的文件!

初始化
为了在整个应用中复用数据库连接,我们通常在 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 |
最佳实践
- 使用 Application 初始化:如前所述,在
Application类中初始化DaoSession,避免重复创建数据库连接。 - 异步操作:数据库操作是 I/O 密集型任务,如果在主线程(UI 线程)执行,会导致应用卡顿甚至 ANR,GreenDao 提供了异步 API:
userDao.insertOrReplaceInTx(user); // 同步事务 userDao.insertOrReplaceAsync(user).listenForTx(); // 异步事务
对于大量数据操作,推荐使用
InTx方法,它会在一个事务中完成,效率更高。 - 合理使用索引:对于经常作为查询条件的字段(如用户名、邮箱),使用
@Index或@Unique注解创建索引,可以极大地提升查询速度。 - 数据迁移:当
schemaVersion改变时,GreenDao 会触发迁移,你需要实现DaoMaster.OpenHelper的onUpgrade方法来处理数据库结构的变更,这是一个比较复杂的话题,对于简单应用,可以直接删除旧数据库,让 GreenDao 重新创建。
GreenDao 是一个非常优秀的本地数据库解决方案,它通过简单的注解和代码生成,将复杂的 SQLite 操作变得异常简单,本教程涵盖了从入门到进阶的主要内容,掌握了这些,你就可以在项目中高效地使用 GreenDao 了。
核心回顾:
- 配置插件:在
build.gradle中添加 GreenDao 插件和依赖。 - 定义实体:用
@Entity等注解标记你的 Java 类。 - 生成代码:Build -> Rebuild Project。
- 初始化:在
Application中创建DaoMaster和DaoSession。 - 操作数据:通过
DaoSession获取具体的Dao对象,调用其insert,delete,update,query等方法。
希望这份教程对你有帮助!
