Android ORM 框架之 greenDAO

我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。而今天的主角便是 greenDAO,下面,我将详解地介绍如何在 Android Studio 上使用 greenDAO,并结合代码总结一些使用过程中的心得。

简单的讲,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。(greenDAO is a light & fast ORM solution that maps objects to SQLite databases.)

而关于 ORM (Object Relation Mapping - 对象关系映射)的概念,可参见 Wikipedia。

GREENDAO 设计的主要目标

1.一个精简的库

2.性能最大化

3.内存开销最小化

4.易于使用的 APIs

5.对 Android 进行高度优化

GREENDAO 设计的主要特点

1.greenDAO 性能远远高于同类的 ORMLite,具体测试结果可见官网

2.greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。

3.与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。

为了在我们的 Android 工程中使用 greenDAO ,我们需要另建一个纯 Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。

关于以上几个类的相关概念与作用,我将在下面的代码(注释)中详细讲解。

当然,你也可以在 官网 中找到相关介绍。

开始==================

一. 新建一个android项目,greenDAO 生成的 Bean、DAO、DaoMaster、DaoSession 等类后面会存在这个android项目中。

二. 新建「GREENDAO GENERATOR」模块 (纯 JAVA 工程)

1.通过 File -> New -> New Module -> Java Library -> 填写相应的包名与类名 -> Finish.

2.编写 ExampleDaoGenerator 类,注意: 我们的 Java 工程只有一个类,它的内容决定了「GreenDao Generator」的输出,你可以在这个类中通过对象、关系等创建数据库结构,下面我将以注释的形式详细讲解代码内容。

package com.example;

import de.greenrobot.daogenerator.DaoGenerator;

import de.greenrobot.daogenerator.Entity;

import de.greenrobot.daogenerator.Schema;

public class ExampleDaoGenerator {

public static void main(String[] args) throws Exception {

// 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。

// 两个参数分别代表:数据库版本号与自动生成代码的包路径。

Schema schema = new Schema(1, “teach.focus.testgreendao”);

// 当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:

// Schema schema = new Schema(1, “me.itangqi.bean”);

// schema.setDefaultJavaPackageDao(“me.itangqi.dao”);

    // 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
    // schema2.enableActiveEntitiesByDefault();
    // schema2.enableKeepSectionsByDefault();

    // 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。
    addNote(schema);

// addNotes(schema);

// 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录,目前会在android项目中src/main/java/teach.focus.testgreendao下面生成。

// 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。

new DaoGenerator().generateAll(schema, “app/src/main/java”);

}

/**
 * @param schema
 */
private static void addNote(Schema schema) {
    // 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)
    Entity note = schema.addEntity("Note");
    // 你也可以重新给表命名
    // note.setTableName("NODE");

    // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
    // 接下来你便可以设置表中的字段:
    note.addIdProperty();
    note.addStringProperty("text").notNull();
    // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
    // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
    note.addStringProperty("comment");
    note.addDateProperty("date");
}
/**
 * @param schema
 */
private static void addNotes(Schema schema) {
    // 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)
    Entity note = schema.addEntity("Notes");
    // 你也可以重新给表命名
    // note.setTableName("NODE");

    // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
    // 接下来你便可以设置表中的字段:
    note.addIdProperty();
    note.addStringProperty("text").notNull();
    // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
    // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
    note.addStringProperty("comment");
    note.addDateProperty("date");
}

}

三. 生成 DAO 文件(数据库)

执行 generator 工程,如一切正常,你将会在控制台看到如下日志,并且在主工程「java-gen」下会发现生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件。

如果在此处出错,你可以依据错误日志进行排查,主要看是否输出目录存在?其他配置是否正确?等

四. 在 ANDROID 工程中进行数据库操作

NoteActivity.java

public class NoteActivity extends ListActivity {

private SQLiteDatabase db;

private EditText editText;

private DaoMaster daoMaster;

private DaoSession daoSession;

private Cursor cursor;

public static final String TAG = “DaoExample”;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_note);
    // 官方推荐将获取 DaoMaster 对象的方法放到 Application 层,这样将避免多次创建生成 Session 对象
    setupDatabase();
    // 获取 NoteDao 对象
    getNoteDao();

    String textColumn = NoteDao.Properties.Text.columnName;
    String orderBy = textColumn + " COLLATE LOCALIZED ASC";
    cursor = db.query(getNoteDao().getTablename(), getNoteDao().getAllColumns(), null, null, null, null, orderBy);
    String[] from = {textColumn, NoteDao.Properties.Comment.columnName};
    int[] to = {android.R.id.text1, android.R.id.text2};

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from,
            to);
    setListAdapter(adapter);

    editText = (EditText) findViewById(R.id.editTextNote);
}

private void setupDatabase() {
    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
    db = helper.getWritableDatabase();
    // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
}

private NoteDao getNoteDao() {
    return daoSession.getNoteDao();
}

/**
 * Button 点击的监听事件
 *
 * @param view
 */
public void onMyButtonClick(View view) {
    switch (view.getId()) {
        case R.id.buttonAdd:
            addNote();
            break;
        case R.id.buttonSearch:
            search();
            break;
        default:
            Log.d(TAG, "what has gone wrong ?");
            break;
    }
}

private void addNote() {
    String noteText = editText.getText().toString();
    editText.setText("");

    final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
    String comment = "Added on " + df.format(new Date());

    // 插入操作,简单到只要你创建一个 Java 对象
    Note note = new Note(null, noteText, comment, new Date());
    getNoteDao().insert(note);
    Log.d(TAG, "Inserted new note, ID: " + note.getId());
    cursor.requery();
}

private void search() {
    // Query 类代表了一个可以被重复执行的查询
    Query query = getNoteDao().queryBuilder()
            .where(NoteDao.Properties.Text.eq("Test1"))
            .orderAsc(NoteDao.Properties.Date)
            .build();

// 查询结果以 List 返回

// List notes = query.list();

// 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值

QueryBuilder.LOG_SQL = true;

QueryBuilder.LOG_VALUES = true;

}

/**
 * ListView 的监听事件,用于删除一个 Item
 * @param l
 * @param v
 * @param position
 * @param id
 */
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // 删除操作,你可以通过「id」也可以一次性删除所有
    getNoteDao().deleteByKey(id);

// getNoteDao().deleteAll();

Log.d(TAG, “Deleted note, ID: ” + id);

cursor.requery();

}

}

五. 运行结果

一切就绪,让我们看看效果吧!运行程序,分别执行添加按钮、删除(点击 List 的 Item)与查询按钮,可以在控制台得到如下日志:

demo下载地址:http://download.csdn.net/detail/dfskhgalshgkajghljgh/9508862

时间: 2024-10-04 12:12:52

Android ORM 框架之 greenDAO的相关文章

Android ORM 框架之 greenDAO 使用心得

原文:http://itangqi.me/android/using-greendao-experience/ 前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.而今天的主角便是 greenDAO,下面,我将

Android Orm框架(GreenDao)

Android Orm框架(GreenDao) 分类: android2014-04-10 14:29 723人阅读 评论(0) 收藏 举报 GreenDao与Ormlite对比 Ormlite:简单好用,比较符合JavaEE开发者使用习惯,注解很方便: GreenDao:为Android大大优化 ,最小的内存使用 ,非常高的性能优势. 官网地址:http://greendao-orm.com/features/ 项目地址:https://github.com/greenrobot/greenD

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

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

打造android ORM框架opendroid(四)——优雅的删除数据

在上一篇博客<打造android ORM框架opendroid(三)--持久化数据>中,我们感受到了opendroid保存数据的流程,今天的博客我们来顺一下opendroid是如何删除数据的. 还记得我们在第一篇博客<打造android ORM框架opendroid(一)--ORM框架的使用>中介绍过opendroid的使用,先来回顾一下怎么利用opendroid来删除数据吧. int length = OpenDroid.delete(Student.class, 1, 2, 3

打造android ORM框架opendroid(五)——数据更新的实现

在上一篇博客<打造android ORM框架opendroid(四)--优雅的删除数据>中,我们介绍了opendroid是如何优雅的从数据库中删除数据的,也可以看到opendroid的设计是如此的简单,其实opendroid只是我作为兴趣或者说是抱着试试的态度写的,当然它肯定存在诸多不足,但是这并不影响我们去了解一个orm框架的流程. 废话不说了,下面进入主题,今天我选择去了解的是opendroid的update流程,其实,对于已经了解了delete操作的朋友们来说,今天的update流程肯定

打造android ORM框架opendroid(二)——自动创建数据库

在上一篇博客<打造android ORM框架opendroid(一)--ORM框架的使用>中相信你已经了解了opendroid的使用,那么从这篇博客开始,我们正式进入opendroid的源码分析,打造一款自己的ORM框架! 在正式开始之前,你需要保证手里有一份opendroid的源码,如果还没下载opendroid,请到http://git.oschina.net/qibin/OpenDroid 下载opendroid的源码. 任何数据库操作都是从创建数据库开始的,今天我们就来看看opendr

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

打造android ORM框架opendroid(六)——级联查询

在上一篇博客<打造android ORM框架opendroid(五)--数据更新的实现>  我们介绍了opendroid数据更新的流程,也就在上次,我们OpenDroid类中的所有操作都介绍完了, 那查询操作呢?不是在OpenDroid中?查询操作是在OpenDroid中,不过是以内部类的形式呈现的. 还是来看看如果使用opendroid查询数据吧. OpenDroid.query.find(Student.class) OpenDroid.query.columns("stuNam

Android ORM系列之GreenDao关联关系映射

上一篇文章对greenDao有一个整体的把握 Android ORM系列之GreenDao最佳实践.这篇文章将重点介绍GreenDao的关联关系的映射以及实体类的生成. 在GreenDao中,实体类的生成是通过Entity类来进行的,可以说一个Entity对象对应一个实体类.实体类中的属性可以通过Entity对象的方法进行添加,GreenDao会根据我们添加的属性自动生成实体类.我们可以通过一系列方法进行操作. 可以自定义一张表的表名 entity.setTableName("test"