GreenDao实现原理
GreenDao 是一款针对 Android 平台优化的轻量级对象关系映射 (ORM) 框架,它将 Java 对象映射到 SQLite 数据库,以简化数据持久化操作。GreenDao 的主要优点包括高性能、低内存占用、易于使用以及对数据库加密的支持。
以下是基于源码的 GreenDao 实现原理分析:
1. 代码生成
GreenDao 的一大特性是在编译阶段生成所有必要的 DAO(Data Access Object)类和相关辅助类,而不是在运行时通过反射来创建这些类。这意味着,当应用程序运行时,GreenDao 不再需要解析复杂的元数据或执行反射调用,从而提高了性能和响应速度。
生成过程:
- 当你使用 GreenDao 时,你需要添加一个注解处理器依赖到你的项目中。
- 编译时,GreenDao 的注解处理器会扫描带有特定注解(如 @Entity)的类。
- 根据这些类的定义,处理器会生成 DAO 类、实体类的映射代码以及其他辅助类,例如 DaoMaster 和 DaoSession。
2. DAO Master 和 DAO Session
- DaoMaster:负责管理整个数据库环境,包括创建和升级数据库版本。DaoMaster 包含了 DevOpenHelper 的实例,用于数据库的创建和版本控制。
- DaoSession:提供了一组方法用于访问和操作所有实体的 DAO。当你需要执行 CRUD 操作时,通常会通过 DaoSession 来获取特定实体的 DAO 实例。
3. 实体映射
每个被标记为 @Entity 的类都会被映射到一个数据库表。GreenDao 支持多种属性类型,包括基本数据类型、枚举、数组和集合等。通过 @Id 注解可以指定主键,而 @Unique 可以确保字段的唯一性。
4. 数据库操作
GreenDao 提供了一系列方法来执行常见的数据库操作,如 insert, update, delete, load 和 queryBuilder。这些方法在 DAO 实例中定义,允许以面向对象的方式进行数据库操作。
5. 性能优化
GreenDao 使用了缓存机制来加速查询,通过缓存实体对象和 SQL 查询结果,减少了数据库的直接访问次数。此外,它还使用了代理模式和策略模式来封装不同的数据库操作,提供了良好的扩展性和维护性。
6. 加密支持
通过集成 SqlCipher 或 SQLite 的加密版本,GreenDao 可以提供数据库级别的加密功能,增强了数据的安全性。
7. 异步操作
GreenDao 支持 RxJava 集成,使得异步数据库操作变得更加简单和高效。
8.基本使用
第一步:项目配置
首先,你需要在你的项目中添加 GreenDao 的依赖。在你的模块级 build.gradle 文件中添加以下依赖:
Groovy
1dependencies { 2 implementation 'org.greenrobot:greendao:3.2.2' 3 kapt 'org.greenrobot:greendao:3.2.2' // kapt 用于处理注解处理器 4}
同时,在 build.gradle 文件中加入 GreenDao 插件配置:
Groovy
1apply plugin: 'com.android.application' 2apply plugin: 'kotlin-android' 3 4android { 5 // ... 6} 7 8dependencies { 9 // ... 10} 11 12greendao { 13 schemaVersion 1 // 数据库版本号 14 daoPackage 'com.example.yourapp.database' // Dao 包名 15 targetGenDir 'src/main/java' // 生成文件的目标目录 16}
第二步:定义实体类
接下来,定义 User 实体类,使用 GreenDao 的注解进行标注:
Java
1package com.example.yourapp.database; 2 3import org.greenrobot.greendao.annotation.Entity; 4import org.greenrobot.greendao.annotation.Id; 5import org.greenrobot.greendao.annotation.Generated; 6 7@Entity 8public class User { 9 @Id(autoincrement = true) 10 private Long id; 11 private String name; 12 private int age; 13 14 public User(String name, int age) { 15 this.name = name; 16 this.age = age; 17 } 18 19 public Long getId() { 20 return id; 21 } 22 23 public void setId(Long id) { 24 this.id = id; 25 } 26 27 public String getName() { 28 return name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public int getAge() { 36 return age; 37 } 38 39 public void setAge(int age) { 40 this.age = age; 41 } 42 43 @Generated(hash = 199499842) 44 public User(Long id, String name, int age) { 45 this.id = id; 46 this.name = name; 47 this.age = age; 48 } 49 50 @Generated(hash = 1669913653) 51 public User() { 52 } 53}
第三步:创建数据库
在你的应用程序中,你需要创建 DaoMaster 和 DaoSession 的实例:
Java
1import org.greenrobot.greendao.database.Database; 2 3import android.content.Context; 4 5public class AppDatabase { 6 private static DaoMaster.DevOpenHelper helper; 7 private static DaoMaster daoMaster; 8 private static DaoSession daoSession; 9 10 public static DaoSession getDaoSession(Context context) { 11 if (helper == null) { 12 helper = new DaoMaster.DevOpenHelper(context, "user-db"); 13 daoMaster = new DaoMaster(helper.getWritableDatabase()); 14 daoSession = daoMaster.newSession(); 15 } 16 return daoSession; 17 } 18}
第四步:使用 GreenDao
现在你可以使用 AppDatabase.getDaoSession() 方法获取 DaoSession,然后使用 UserDao 进行数据库操作:
Java
1import org.greenrobot.greendao.query.QueryBuilder; 2 3import android.app.Activity; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.Button; 7import android.widget.TextView; 8 9public class MainActivity extends Activity { 10 private Button insertButton; 11 private TextView textView; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 insertButton = findViewById(R.id.insert_button); 19 textView = findViewById(R.id.text_view); 20 21 insertButton.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 insertUser(); 25 } 26 }); 27 } 28 29 private void insertUser() { 30 DaoSession daoSession = AppDatabase.getDaoSession(this); 31 UserDao userDao = daoSession.getUserDao(); 32 33 User user = new User("John Doe", 30); 34 userDao.insert(user); 35 36 QueryBuilder queryBuilder = userDao.queryBuilder(); 37 List users = queryBuilder.where(UserDao.Properties.Name.eq("John Doe")).list(); 38 textView.setText(users.get(0).getName()); 39 } 40}
以上就是一个基本的 GreenDao 使用示例,展示了如何定义实体类、创建数据库、以及如何插入和查询数据。注意,实际项目中可能需要根据具体需求调整数据库的创建逻辑,比如处理数据库升级的情况。
结论
GreenDao 的设计原则是尽量减少运行时的开销,通过预编译代码生成和缓存机制来提升性能。它提供了丰富的 API 来简化数据库操作,并且通过注解驱动的方式降低了使用门槛。如果你正在寻找一个高性能且易于使用的 Android 数据库解决方案,GreenDao 是一个值得考虑的选择。