Android ORM数据库之GreenDao使用教程及源码分析

本文详细介绍了Android ORM框架GreenDao,包括其在SQLite数据库操作中的优势,如高性能、简易API和低内存消耗。文章阐述了GreenDao的工作原理,四大核心类DaoMaster、DaoSession、UserDao和User的职责,以及如何在项目中配置和使用GreenDao。通过封装Helper类,简化了数据库操作,提供了一个实用的数据库管理解决方案。
摘要由CSDN通过智能技术生成

一、简介
1.Android ORM介绍
 在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。下面先介绍下当前流行的5种ORM数据库框架:
1)OrmLite
 OrmLite不是Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。

2)SugarORM
 SugarORM是Android 平台专用ORM。提供简单易学的APIs。可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化CRUD基本操作。

3)Active Android
 Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。

4)Realm
 Realm 是一个将可以使用的Android ORM,基于C++编写,直接运行在你的设备硬件上(不需要被解释),因此运行很快。它同时是开源跨平台的,iOS的代码可以在GitHub找到。

5)GreenDAO
 GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

2.GreenDao介绍及优点

介绍:
 GreenDAO就是实现Java对象和SQLite Datebase的一个媒介人,简化了SQLite的操作,而且他的数据库操作效率非常高。可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。
官网网址:http://greenrobot.org/greendao/features//

优点:
1)最大性能(最快的Android ORM),GreenDAO 性能远远高于同类的 ORMLite(可见下图);
2)简易API,通过Java工程生成的类中方法全都自动写好了,可以直接调用;
3)高度优化,GreenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射;与ORMLite等使用注解方式的ORM框架不同,greenDAO使用Code generation的方式,这也是其性能能大幅提升的原因。
4)最小内存消耗。
GreenDAO与ORMLite比较

二、配置

配置Java工程
1)在Android Studio中选择File -> New -> New Module -> Java Library建立GreenDAO Generate工程;并且在该工程build.gradlew里添加以下依赖:

compile 'org.greenrobot:greendao-generator:2.2.0'

2)在新建的Java工程中新建一个Java类,该Java类用于生成项目所需的Bean、DAO等文件,以下是该类需要写的代码:

public class ExampleDaoGenerator {
   

    public static void main(String[] args) throws Exception {
        // 创建了一个用于添加实体(Bean)的模式(Schema)对象。
        // 两个参数分别代表:数据库版本号与自动生成代码的包路径。
        Schema schema = new Schema(1, "com.example.jianglei.greendaotestdemo.db.bean");
        // 也可以分别指定生成的 Bean 与 DAO 类所在的目录
        schema.setDefaultJavaPackageDao("com.example.jianglei.greendaotestdemo.db.dao");
        //通过次Schema对象添加的所有实体都不会覆盖自定义的代码
        // schema.enableKeepSectionsByDefault();
        // 创建Schema对象后,就可以使用它添加实体(Bean)了。
        addUser(schema);

        // 最后使用 DAOGenerator 类的 generateAll()方法自动生成代码,根据自己的情况更改输出目录
        new DaoGenerator().generateAll(schema,                   
                         "D:\\WorkSpace_01\\GreenDaoTestDemo\\app\\src\\main\\java");
    }

    /**
     * @param schema
     */
    private static void addUser(Schema schema) {
        // 一个实体(类)就关联到数据库中的一张表,此处表名为「User」
        Entity note = schema.addEntity("User");
        // 也可以重新给表命名
        // note.setTableName("NODE");
        //单独让某个实体不覆盖自定义的代码
        // note.setHasKeepSections(true);
        // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
        note.addIdProperty().notNull().primaryKey();
        note.addStringProperty("name").notNull();
        // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
        note.addIntProperty("age").notNull();
    }
}

完成该类的编写后,点击Run来执行这个类可以看到:
自动生成所需要的类
生成目录

三、工作原理

四个核心类的功能体系及工作原理如下图所示:
这里写图片描述  这里写图片描述

DaoMaster:
 一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。

public class DaoMaster extends AbstractDaoMaster {
   
    public static final int SCHEMA_VERSION = 1;

    /** Creates underlying database table using DAOs. */
    public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) {
        UserDao.createTable(db, ifNotExists);
    }

    /** Drops underlying database table using DAOs. */
    public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {
        UserDao.dropTable(db, ifExists);
    }

    public static abstract class OpenHelper extends SQLiteOpenHelper {
   

        public OpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory, SCHEMA_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
            createAllTables(db, false);
        }
    }

    /** WARNING: Drops all table on Upgrade! Use only during development. */
    public static class DevOpenHelper extends OpenHelper {
   
        public DevOpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }
    }

    public DaoMaster(SQLiteDatabase db) {
        super(db, SCHEMA_VERSION);
        registerDaoClass(UserDao.class);
    }

    public DaoSession newSession() {
        return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
    }

    public DaoSession newSession(IdentityScopeType type) {
        return new DaoSession(db, type, daoConfigMap);
    }

}

 从DaoMast

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值