当前位置: 首页 > news >正文

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, loadqueryBuilder。这些方法在 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}

第三步:创建数据库

在你的应用程序中,你需要创建 DaoMasterDaoSession 的实例:

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<User> queryBuilder = userDao.queryBuilder();
37        List<User> users = queryBuilder.where(UserDao.Properties.Name.eq("John Doe")).list();
38        textView.setText(users.get(0).getName());
39    }
40}

以上就是一个基本的 GreenDao 使用示例,展示了如何定义实体类、创建数据库、以及如何插入和查询数据。注意,实际项目中可能需要根据具体需求调整数据库的创建逻辑,比如处理数据库升级的情况。

结论

GreenDao 的设计原则是尽量减少运行时的开销,通过预编译代码生成和缓存机制来提升性能。它提供了丰富的 API 来简化数据库操作,并且通过注解驱动的方式降低了使用门槛。如果你正在寻找一个高性能且易于使用的 Android 数据库解决方案,GreenDao 是一个值得考虑的选择。

http://www.lryc.cn/news/400602.html

相关文章:

  • Perl语言之数组
  • 写材料word和PPT
  • Centos---命令详解 vi 系统服务 网络
  • 【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页
  • [ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法
  • 函数传值面试题
  • redis笔记2
  • Kafka(四) Consumer消费者
  • 前端路由手写Hash和History两种模式
  • Redis的单线程讲解与指令学习
  • 为什么MySQL会选择B+树作为索引
  • k8s secret-从环境变量里去读和从yaml文件里读取secret有什么区别?
  • Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存
  • 无线物联网新时代,RFID拣货标签跟随潮流
  • Java8 根据List实体中一个字段去重取最大值,并且根据该字段进行排序
  • 微服务经纬:Eureka驱动的分布式服务网格配置全解
  • 关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划
  • linux进行redis的安装并使用RDB进行数据迁移
  • 深入理解Scikit-learn:决策树与随机森林算法详解
  • AutoHotKey自动热键(十一)下载SciTE4AutoHotkey-Plus的中文增强版脚本编辑器
  • Halcon与C++之间的数据转换
  • MybatisPlus 一些技巧
  • 定制化服务发现:Eureka中服务实例偏好的高级配置
  • 【实战场景】MongoDB迁移的那些事
  • 为什么要使用加密软件?
  • k8s学习笔记——dashboard安装
  • AI艺术创作:掌握Midjourney和DALL-E的技巧与策略
  • 在Mac上免费恢复误删除的Word文档
  • HarmonyOS 屏幕适配设计
  • Netfilter之连接跟踪(Connection Tracking)和反向 SNAT(Reverse SNAT)