GreenDao 使用总结
1、GreenDao 概述
GreenDao 是 Android 平台上的一个轻量级 ORM(对象关系映射)库,旨在简化 SQLite 数据库的操作。它由 greenrobot 团队开发,提供了高效、简洁的数据库访问方式,是 Android 开发中常用的数据库解决方案之一。
核心特点:
- 高性能:针对 Android 进行了优化,执行速度快
- 内存占用小:代码精简,运行时内存消耗低
- 易于使用:提供简洁的 API,减少样板代码
- 支持复杂查询:支持 SQL 语句和链式查询
- 自动生成代码:通过注解处理器生成数据库操作代码
应用场景:
- 本地数据存储
- 缓存网络数据
- 应用配置和用户偏好设置
- 需要持久化存储的任何 Android 应用
2、核心概念
2.1、实体(Entity)
实体是数据库表的映射,通过注解定义:
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
private int age;
// getter 和 setter 方法
}2.2、DAO(Data Access Object)
DAO 是数据访问对象,负责数据库的 CRUD 操作:
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Update
void update(User user);
@Delete
void delete(User user);
@Query("SELECT * FROM User")
List<User> getAll();
@Query("SELECT * FROM User WHERE name = :name")
User findByName(String name);
}2.3、数据库(Database)
数据库类管理数据库连接和版本控制:
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends DaoMaster.OpenHelper {
public abstract UserDao userDao();
public static AppDatabase getInstance(Context context) {
// 单例模式实现
}
}2.4、DaoSession
DaoSession 是 DAO 的工厂,提供对所有 DAO 的访问:
DaoSession daoSession = appDatabase.getDaoSession();
UserDao userDao = daoSession.getUserDao();3、基本使用方法
3.1、添加依赖
在 build.gradle 文件中添加依赖:
dependencies {
implementation 'org.greenrobot:greendao:3.3.0'
annotationProcessor 'org.greenrobot:greendao-generator:3.3.0'
}3.2、创建实体类
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@NotNull
private String name;
private int age;
// 生成 getter 和 setter 方法
}3.3、初始化数据库
public class App extends Application {
private static AppDatabase appDatabase;
@Override
public void onCreate() {
super.onCreate();
// 初始化数据库
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "app.db");
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
appDatabase = new AppDatabase() {
@Override
public UserDao userDao() {
return daoSession.getUserDao();
}
};
}
public static AppDatabase getDatabase() {
return appDatabase;
}
}3.4、CRUD 操作
// 插入
User user = new User();
user.setName("John");
user.setAge(25);
App.getDatabase().userDao().insert(user);
// 更新
user.setAge(26);
App.getDatabase().userDao().update(user);
// 删除
App.getDatabase().userDao().delete(user);
// 查询所有
List<User> users = App.getDatabase().userDao().getAll();
// 条件查询
User user = App.getDatabase().userDao().findByName("John");4、高级特性
4.1、复杂查询
@Dao
public interface UserDao {
// 链式查询
@Query("SELECT * FROM User WHERE age > :minAge ORDER BY name ASC")
List<User> findUsersOlderThan(int minAge);
// 多条件查询
@Query("SELECT * FROM User WHERE name LIKE :namePattern AND age > :minAge")
List<User> findUsersByNamePatternAndAge(String namePattern, int minAge);
// 聚合函数
@Query("SELECT COUNT(*) FROM User")
long countUsers();
// 分组查询
@Query("SELECT age, COUNT(*) FROM User GROUP BY age")
List<UserAgeCount> countUsersByAge();
}4.2、事务处理
// 开始事务
daoSession.runInTx(() -> {
// 执行多个数据库操作
userDao.insert(user1);
userDao.insert(user2);
userDao.delete(user3);
});4.3、索引
@Entity(indexes = {
@Index(value = "name, age", unique = true)
})
public class User {
@Id
private Long id;
private String name;
private int age;
}4.4、迁移
// 数据库版本升级
public class AppDatabase extends DaoMaster.OpenHelper {
public AppDatabase(Context context, String name) {
super(context, name);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 处理数据库升级
MigrationHelper.migrate(db, UserDao.class, NoteDao.class);
}
}5、最佳实践
5.1、性能优化
- 使用批量操作:对于大量数据,使用 insertInTx()、updateInTx() 等批量方法
- 避免在主线程执行数据库操作:使用异步线程或 RxJava
- 合理使用索引:为常用查询字段添加索引
- 关闭游标:确保查询结果的游标正确关闭
5.2、代码结构
- 采用 Repository 模式:封装数据库操作逻辑
- 分层设计:将数据库操作与业务逻辑分离
- 使用单例模式:确保数据库实例唯一
- 统一异常处理:集中处理数据库操作异常
5.3、常见问题
问题1:数据库版本升级
解决:使用 GreenDao 的 MigrationHelper 或自定义迁移逻辑
问题2:性能问题
解决:使用批量操作,避免在主线程执行数据库操作
问题3:内存泄漏
解决:正确管理数据库连接,避免长生命周期持有
问题4:并发访问
解决:使用事务和同步机制,避免并发冲突
5.4、与其他 ORM 库比较
- GreenDao:性能高,内存占用小,适合中小规模应用
- Room:Google 官方推荐,与 Architecture Components 集成良好
- ORMLite:功能丰富,学习曲线较平缓
- SugarORM:使用简单,但性能和功能相对有限
6、总结
GreenDao 是一款优秀的 Android ORM 库,它通过简化数据库操作,提高了开发效率,同时保持了高性能和低内存占用。通过合理使用 GreenDao,可以:
- 减少样板代码,提高开发效率
- 简化数据库操作,降低出错概率
- 支持复杂查询,满足各种业务需求
- 提供事务支持,确保数据一致性
- 易于集成和使用,学习曲线平缓
掌握 GreenDao 的使用,对于 Android 开发者来说,是一项重要的技能。通过合理设计数据模型和数据库操作,可以构建出高效、可靠的本地数据存储系统,为应用提供更好的用户体验。
GreenDao 的优势在于其高性能和简洁的 API,使其成为 Android 开发中处理本地数据存储的理想选择。无论是小型应用还是大型项目,GreenDao 都能提供稳定、高效的数据库访问解决方案。


