Android ORM框架 greenDao使用

时间:2022-05-24 19:51:03

前言:

开发过程中,总会进行数据存储操作。当文件不能满足需求时,就会使用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学习心得及使用总结