GreenDao实现原理

07-19 1237阅读

GreenDao 是一款针对 Android 平台优化的轻量级对象关系映射 (ORM) 框架,它将 Java 对象映射到 SQLite 数据库,以简化数据持久化操作。GreenDao 的主要优点包括高性能、低内存占用、易于使用以及对数据库加密的支持。

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 是一个值得考虑的选择。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]