前言:
开发过程中,总会进行数据存储操作。当文件不能满足需求时,就会使用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. 添加依赖
- 在Android app项目中
添加依赖: compile ‘de.greenrobot:greendao:2.1.0’ -
创建 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学习心得及使用总结