一、概述
在项目开发中,我们或多或少需要接触到SQLite,但是在使用时,还是稍显复杂,并且需要进行测试、解析查询结果等等。于是,适用于Android的ORM(Object Relation Mapping)框架出现了,比较流行的有greenDao、Realm、OrmLite、SugarORM、ActivteAndroid等。在此次项目开发中,我们将使用其中的greenDao。
greenDao是一个使用Code generation方式的框架,它的性能忧于同类的其它框架。greenDao在版本更新上有greenDao2.x系列和greenDao3.0系列,最新的greenDao已经发展到v3.1.1,本次项目开发中,我们将引入greenDao3.1.1下面将讲述greenDao3.x的使用步骤。
Giuthub:https://github.com/greenrobot/greenDAO
二、使用步骤
1.引用该框架
compile 'org.greenrobot:greendao:3.1.1'
compile 'org.greenrobot:greendao-generator:3.1.0'
2.build.gradle配置中配置greenDao服务插件,这一步非常关键。
apply plugin: 'org.greenrobot.greendao'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
}
}
配置好greenDao服务插件后,当我们sync project的时候,会自动从maven仓库下载该插件。该插件是用来生成与数据库操作相关的代码的,非常重要。
3.在build.gradle中配置greenDao属性
至此,build.gradle文件的配置就完成了。
greendao {
schemaVersion 1
daoPackage 'com.huatec.edu.greendao3_demo.gen'
targetGenDir 'src/main/java'
}
dependencies {
...
}
schemaVersion:数据库schema版本,或数据库版本号。
daoPackage:通过greenDao服务插件生成的数据库代码文件所在的包名,默认为实体类所在的包名。
targetGenDir:数据库代码文件所在的目录,默认是“build/gererated/source/greenDao”,这里我们将其自定义到我们的java目录中“src/main/java”方便查看和编辑,不配置的话将会保存在默认目录下。
除了这些属性之外,还有一些属性如下:
targetGenDirTest:设置生成单元测试目录。
generateTests:设置自动生成单元测试用例。
4.创建实体类,并生成与数据库操作相关的代码。
因为本次项目需要缓存商品列表数据和收藏ed商品,下面以商品列表类Category为例说明如何生成与数据库操作相关的代码。新建Category类如下:
@Entity
public class Category implements Serializable {
/**
* 这里使用greenDao注解的方式来生成相关的方法。
* @Id 可以将该属性设计为Category表的主键并自增长,注意类型为Long。
* @Transient 可以设置保留属性,该属性将不会为表字段。
*/
@Id
private Long cat_id; //商品分类id,可以设计为表的主键并自增长
private String name; //分类名称,如酒、红酒、长城红酒都属于分类名称。
private int parent_id; //父级id
private String cat_path; //商品所属级别信息,比如长城红酒属于酒-->红酒这个级别
private int goods_count; //商品数量
private int sort; //排序信息
private int type_id; //所属类别,比如红酒分类属于酒这个列别
private int list_show; //是否显示该商品
private String image; //商品图片
}
我们在该类的名称上使用@Entity进行注解,当我们点击Build–>Make Project功能时,greenDao的服务插件将会扫描整个项目下的所有@Entity注解类,并自动在我们配置的目录和包名下生成代码。这里将会在com.huatec.edu.greendao3_demo.gen目录下生成与数据库操作相关的类CategoryDao、DaoMaster和DaoSession,并自动完成Category类属性的set/get方法、无参构造器和全参构造器的创建。代码生成完毕后的项目包结构如图3-11所示。由图我们可以看出,自动生成的代码和我们在build.gradle中对greenDao配置的信息是相符合的。其中Category类的名称就是数据表的名称,在该类中定义的非保留属性名称就是该表的字段名称。CategoryDao负责Category表的操作逻辑,而且greenDao会负责创建该表,无须我们手动通过代码来创建。
一般在使用时,我们可以一次性将需要的@Entity类都创建完成,当然我们也可以在原有的数据库版本上通过新增@Entity类来新增数据表。不过在Make Project之前,请做好数据库的备份和迁移工作。
5.greenDao的全局配置。
新建GreenDaoManager类,进行greenDao的基本配置,代码如下:
public class GreenDaoManager {
private static GreenDaoManager mInstance; //单例
private DaoMaster mDaoMaster; //以一定的模式管理Dao类的数据库对象
private DaoSession mDaoSession; //管理制定模式下的所有可用Dao对象
public GreenDaoManager() {
if (mInstance == null) {
DaoMaster.DevOpenHelper devOpenHelper = new
DaoMaster.DevOpenHelper(MyApplication.getContext(), "mydb", null);
mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
}
}
public static GreenDaoManager getInstance() {
if (mInstance == null) {
synchronized (GreenDaoManager.class) {
if (mInstance == null) {
mInstance = new GreenDaoManager();
}
}
}
return mInstance;
}
public DaoMaster getMaster() {
return mDaoMaster;
}
public DaoSession getSession() {
return mDaoSession;
}
public DaoSession getNewSession() {
mDaoSession = mDaoMaster.newSession();
return mDaoSession;
}
}
在上面的代码中,我们为GreenDaoManager类创建了线程安全式的单例模式,并在构造器中,对DaoMaster和DaoSession实例进行了初始化。其中的DaoMaster.DevOpenHelper是一个比较重要的类,我们通过它来获取数据库对象。新建一个该类的对象我们需要传入三个参数,第一个参数为上下文对象,第二个对象为数据库名称,如上述代码中,我们的数据库名称为“mydb”,第三个对象为CursorFactory游标工厂,默认情况下可以为空。
GreenDaoManager类用于对greenDao进行基本配置。但是在整个app中,我们只希望有且只有一份这样的配置,所以我们需要将该配置全局化,我们只需要在MyApplication中应用该配置即可,代码如下。
public class MyApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
//greenDao全局配置
GreenDaoManager.getInstance();
}
public static Context getContext() {
return mContext;
}
}
至此,我们已经完成了greenDao的引入了,并创建了数据库“mydb”和数据表“Category”。