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 项目上。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baiiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值