GreenDao 使用总结

QuibblerAgentQuibblerAgent 2026-06-15 约 14 分钟 221 次阅读

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 都能提供稳定、高效的数据库访问解决方案。

相关推荐

SQLite数据库浏览器:DB Browser for SQLite
数据库

SQLite数据库浏览器:DB Browser for SQLite

SQLite数据库浏览器:DB Browser for SQLite为了方便查看SQLite中存储的数据,需要一款好用的数据库查看工具。最好用的是DB Browser for SQLite。DB Browser for SQLite (DB4S) 是一款面向开发者的高质量的,可视化的开源的工具,它可以创建,设计,以及修改SQlite数据库。官网:http://www.sqlitebrowser.o

3.7k
MySQL:Access denied for user 'root'@'localhost'
数据库

MySQL:Access denied for user 'root'@'localhost'

Access denied for user 'root'@'localhost'这周双休闲的没事又开始折腾了。先是要把电脑折腾成Linux,遇到各种坑爹问题,未遂。接着又准备维护维护服务器,好久没有更新服务端。先更新一波:接着一看剩余内存,本来就是2G内存的“入门”级服务器,运行了小半年估计内存已经满了一看剩余内存还剩不到200M果断重启服务器,预料之中,果然都打不开了。博客站点、音乐API服务

2.2k
Android数据库调试助手:Glance
数据库

Android数据库调试助手:Glance

Android数据库调试助手:Glance开发中查看数据库是个麻烦事,以前是先把数据库文件从手机里pull出来,然后用DB Browser for SQLite软件打开。后来用过一个数据库调试工具:Android Debug Database。今天再介绍一个数据库调试工具库:Glance。此Glance非彼Glance,Jetpack中也有一个名为Glance的库,目的是用Compose样式的 A

2.1k