您的当前位置:首页正文

开源框架greenDao的使用(一)-greenDao2

2024-11-29 来源:个人技术集锦

一、greenDao概述

1.概述

适用于 Android 主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。在近期的项目开发中再次采用greenDao作为数据库模块的解决方案,今天我将详解地介绍如何在 Android Studio 上使用 greenDAO。

2.设计目标

  • 一个精简的库
  • 性能最大化
  • 内存开销最小化
  • 易于使用的 APIs
  • 对 Android 进行高度优化

3.设计的主要特点

  • greenDAO 性能远远高于同类的 ORMLite。
  • greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf协议与服务器交互,将不需要任何的映射。
  • 与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用Code generation的方式,这也是其性能能大幅提升的原因。

4.相关

  • Giuthub:
  • greenDao官网:
  • greenDao2的引入地址(Github上面已经更新到greenDao3)
 compile 'de.greenrobot:greendao:2.1.0'

二、greenDao2的使用

1.build.gradle配置

1)与buildTypes节点并列,增加sourceSets内容,如下。

    buildTypes {
      ...
    }
    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }

2)compile greenDao2

    compile 'de.greenrobot:greendao:2.1.0'

2.建立java-gen目录

3.创建java项目

在当前项目中,新建一个 java 项目作为一个module,步骤如下:
(1)New Module选择Java Library,项目名称为:greendao_java,main类名称为Generator,如下图所示。

apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //新增
    compile 'de.greenrobot:greendao-generator:2.1.0'
}

(3)编写Generator类代码如下,并运行。Android Studio运行java项目需要进行配置,参考第四步。

package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class Generator {
    //数据库版本
    private static int version = 1;
    //生成的bean文件存放路径
    private static String defaultPackage = "com.huatec.edu.bean";
    //生成的dao、session等文件的存放路径
    private static String getDefaultPackageDao = "com.huatec.edu.dao";
    //生成的代码存储路径,这里使用的是相对路径
    private static String outUri = "./app/src/main/java-gen";

    public static void main(String[] args) throws Exception {
        //创建模式对象,指定版本号和自动生成的bean对象的包名
        Schema schema = new Schema(version, defaultPackage);
        //指定自动生成的dao对象的包名,不指定则都DAO类生成在"test.greenDAO.bean"包中
        schema.setDefaultJavaPackageDao(getDefaultPackageDao);
        //添加实体
        addStudent(schema);
        addTeacher(schema);

        //调用DaoGenerator().generateAll方法自动生成代码到之前创建的java-gen目录下
        new DaoGenerator().generateAll(schema, outUri);
    }


    private static void addStudent(Schema schema) {
        //添加一个实体,则会自动生成实体Student类
        Entity entity = schema.addEntity("Student");
        //指定表名,如不指定,表名则为 Student(即实体类名)
        entity.setTableName("student");
        entity.addIdProperty().autoincrement();//添加Id,自增长
        entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
        entity.addIntProperty("age");//添加Int类型的age
        entity.addDoubleProperty("score");//添加Double的score
        entity.addStringProperty("school");
    }

    private static void addTeacher(Schema schema) {
        Entity entity = schema.addEntity("Teacher");
        entity.addIdProperty().autoincrement();
        entity.addStringProperty("name").notNull();
        entity.addIntProperty("age");
    }
}

这里我新建了两个实体类,也就是新建了两个数据表,实体类的成员变量名就是表的字段,如果想要新建更多的表可以参考上面的形式。
(4)运行java项目
在Android Studio中想要运行Java项目,需要配置才行。依次打开菜单“Run”——“Edit Configurations”,弹出“Run/Debug Configurations”窗体。

4.配置MyApplication

在app module下新建MyApplication类,配置数据库的基本信息,示例代码如下。

public class MyApplication extends Application {

    public DaoSession daoSession;
    public SQLiteDatabase db;
    public DaoMaster.DevOpenHelper helper;
    public DaoMaster daoMaster;

    @Override
    public void onCreate() {
        super.onCreate();
        setupDatabase();
    }
    //配置数据库
    private void setupDatabase() {
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        /**
         * TODO 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。将原来数据库的数据迁移到新的数据库中。
          */
        helper = new DaoMaster.DevOpenHelper(this, "myDb", null);
        //得到数据库连接对象
        db = helper.getWritableDatabase();
        //得到数据库管理者
        daoMaster = new DaoMaster(db);
        //得到daoSession,可以执行增删改查操作
        daoSession = daoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

}

5.增删改查的基本操作

就拿StudentDao类来说,它是自动生成的类,该类继承自AbstractDao,在该基类中定义了数据库的常用基本操作。所以,实际上使用greenDao来进行增删改查就变得很简单。

   /**
     * 插入
     */
    private void addEntity() {
        if (!TextUtils.isEmpty(name)) {
            Student entity = new Student(null, name, age, score, school);
            //面向对象添加表数据
            studentDao.insert(entity);
            cursor.requery();//刷新
        } else {
            Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 根据id删除
     *
     * @param id
     */
    private void deleteEntity(long id) {
        studentDao.deleteByKey(id);
        cursor.requery();
    }

    /**
     * 更新
     */
    private void updateList() {
        Student entity = new Student(id, name, age, score, school);
        studentDao.update(entity);
        cursor.requery();
    }

    /**
     * 根据name查询
     *
     * @param name
     */
    private void query(String name) {
        if (!TextUtils.isEmpty(this.name)) {
            // Query 类代表了一个可以被重复执行的查询
            Query<Student> query = studentDao.queryBuilder()
                    .where(StudentDao.Properties.Name.eq(this.name))
                    .orderAsc(StudentDao.Properties.Id)
                    .build();
            // 查询结果以 List 返回
            List count = query.list();
            Toast.makeText(MainActivity.this, count.size() + "条数据被查到", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 查询全部
     */
    private void queryAll() {
        // Query 类代表了一个可以被重复执行的查询
        Query<Student> query = studentDao.queryBuilder()
                .orderAsc(StudentDao.Properties.Id)
                .build();
        // 查询结果以 List 返回
        List count = query.list();
        Toast.makeText(MainActivity.this, count.size() + "条数据被查到", Toast.LENGTH_SHORT).show();
    }

三、测试demo

显示全文