Android ORM框架 greenDao使用

前言:

开发过程中,总会进行数据存储操作。当文件不能满足需求时,就会使用SQLite进行存储。于是就有很多ORM框架出现。在这里自己选择使用greenDao作为项目的数据库框架。greenDao在所有的Android数据库ORM开源框架中效率最高,官网这么描述:probably the fastest ORM for Android.

但是greenDao学习曲线并不如其他的框架那么简单,也算是有长有短。这篇文章就是自己使用greenDao过程中的笔记和总结。主要是大量看官方文档,它的官方文档比几个月前写的好太多,而且很清晰,很容易就看懂了。

greenDaode的特点:

  • Maximum performance (probably the fastest ORM for Android)
    性能最优化
  • Easy to use but powerful APIs covering relations and joins
    易用性高,API方便
  • Minimal memory consumption
    占用内存最小化
  • Small library size to keep your build times low and to avoid the 65k method limit
    greenDao库小

使用方法:

1. 添加依赖

  1. 在Android app项目中
    添加依赖: compile ‘de.greenrobot:greendao:2.1.0’
  2. 创建 Java Libray
    添加依赖: compile ‘de.greenrobot:greendao-generator:2.1.0’

2. 创建java-gen目录

在Android app中的 src/main目录下创建 java-gen目录,用于存放greenDao生成的文件。
并在build.gradle中添加sourceSets。

android {
    ...

    //添加sourceSets,将创建的java-gen添加进来。
    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }
    }
}

3. 编写Java实体类,生成代码

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

    //创建Schema模式对象
    //两个参数, 数据库版本号 与 自动生成代码的包路径
    Schema schema = new Schema(1, "baiiu.greendao.gen");

    //添加实体
    addEntity(schema);

    //生成代码.使用相对路径
    new DaoGenerator().generateAll(schema,"../ZhihuDaily/app/src/main/java-gen");
  }

    //添加实体类
  private static void addEntity(Schema schema) {
    //创建实体类,Person表明创建Person表
    Entity topStory = schema.addEntity("Person");

    topStory.addIdProperty();
    topStory.addStringProperty("name");
    topStory.addStringProperty("age");

  }
}

编写完数据存储对象后,run该main()方法,就会在指定路径下生成响应的类。

关于更多定义Entity介绍,请看官网,讲的真的很详细。modelling-entities。

4. greenDao生成核心类介绍

DaoMaster:

The entry point for using greenDAO. DaoMaster holds the database object (SQLiteDatabase) and manages * DAO classes (not objects) for a specific schema.*

使用greenDao的入口。该类持有SQLiteDatabase对象并管理生成的实体类对象.class。


DaoSession:

Manages all available DAO objects for a specific schema, which you can acquire using one of the getter methods.

DaoSession 管理所有的由schema生成的Dao对象,并提供getter()方法获取该Dao对象。


DAOs (Data Access objects):

DAOs persists and queries for entities. For each entity, greenDAO generates a DAO. It has more persistence methods than the DaoSession.

Daos 对这些实体类提供持久化、可获取的方法。对于每一个Entitiy,greenDao生成一个对应的DAO,该Dao对象比DaoSession提供更多的方法。


Entities:

Persistable objects. Usually, entities are generated。
持久化对象。通常是由greenDao生成的。



5.初始化,开始使用:

官网介绍:

    DaoMaster.DevOpenHelper helper =
        new DaoMaster.DevOpenHelper(UIUtil.getContext(), DB_NAME, null);
    SQLiteDatabase db = helper.getWritableDatabase();

    //获取DaoMaster对象
    DaoMaster daoMaster = new DaoMaster(db);

    //获取DaoSession对象,其内持有各种EntitiyDao
    DaoSession daoSession = daoMaster.newSession();

    //实体类Dao,用来对数据库进行操作
    EntityDao entityDao = daoSession.getEntityDao();

在项目实践中,我们一般都有一个DBManger来进行存储。通过这一层再封装一层数据库,以方便之后替换数据库。

代码如下,使用单例模式获取DaoSession,再通过daoSession获取其他的XxxDao。

public class DBManager {
  private static final String DB_NAME = "daily-db";

  private static DBManager dbManager;//单例对象

  //daoSession成员变量,通过它来获取其他Daos
  private DaoSession daoSession;

  private DBManager() {
    //初始化greenDao
    DaoMaster.DevOpenHelper helper =
        new DaoMaster.DevOpenHelper(UIUtil.getContext(), DB_NAME, null);
    SQLiteDatabase db = helper.getWritableDatabase();
    DaoMaster daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();//获取daoSession
  }

  //单例
  public static DBManager instance() {
    if (dbManager == null) {
      synchronized (DBManager.class) {
        if (dbManager == null) {
          dbManager = new DBManager();
        }
      }
    }

    return dbManager;
  }

  //获取dao
  private SavedStoryDao getSavedStoryDao() {
    return daoSession.getSavedStoryDao();
  }

  //存储list
  public void saveStoryList(List<SavedStory> list) {
    getSavedStoryDao().insertOrReplaceInTx(list);
  }

  //读取list
  public List<SavedStory> getStoryList(String date) {
    List<SavedStory> savedStories =
       getSavedStoryDao().queryBuilder().where(SavedStoryDao.Properties.Date.eq(date)).list();
    return savedStories;
  }
}

这种方式可能还不是最好的方式。网上还有很多是将初始化过程放在Application中,然后通过application对象获取。

结语:

greenDao之前也使用过,这次好好整理了一次。学到了不少,相信随着代码写的越来越熟悉,也会将它用的越来越好。
相关使用在 github 项目上。代码还未完成,可以看下greenDao。


参考:
green-dao官网
greenDao documentation
tangqi 的 MyGreenDAO <—注释很清晰,上手很快
数据库ORM框架GreenDao学习心得及使用总结

你可能感兴趣的:(数据库,android,orm,开源框架,数据存储)