前言
网上看了很多关于Android数据库的GreenDao的使用,具体优点不多说了,网上很多。但是当自己使用的过程中发现了一些问题,所以决定自己写一篇关于GreenDao的使用,仅做参考记录。
介绍
参考http://blog.csdn.net/dawnranger/article/details/43231731
ORM
ORM(Object Relation Mapping):对象关系模型。用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。ORM作为项目中间件形式实现数据在不同场景下数据关系映射,对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
Android常用几个ORM框架:ORMLite、GreenDao、ormndroid、androrm等。ORMLite和GreenDao的比较:
ORMLite:文档全面,社区活跃,维护良好,使用简单,容易上手,但是因为基于反射,所效率较低。
GreenDao:使用code generation,效率很高;库文件较小(约87KB),占用更少内存, 缺点是学习成本较高,需要弄清楚其原理才能方便使用。GreenDao向SQLite数据库提供了一个对象导向的接口,它为用户省下了很多重复的工作,而且提供了简便的操作接口。根据GreenDao的规则在其中描述数据库的表结构,运行之后它会构建你的实体模型和DAO工具类。具体包括:
DaoMaster
DaoMaster:持有数据库对象(SQLiteDatabase) ,并管理一些DAO类(不是对象)。能够创建和删除数据库表。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式。
列表DaoSession
DaoSession:管理制定模式下所有可用的DAO对象,能对实体进行插入、加载、更新、刷新、删除操作。
DAO
DAO:每个实体都有一个DAO,相对于DaoSession,它有更多的方法,比如:加载全部、InsertTx
Entity
Entity:可持久化的对象,由generator 生成。相当于数据库中的一张表,所有字段都是使用标准的Java对象的属性,通过generator生成的这些工具类,你就可以在自己的android工程中对进行数据库操作,完全不需要写任何SQL语句。
应用
1. GreenDao配置
①:在app程序的build.gradle中添加dependencies.
切记切记:
1:是在app Module中的build.gradle设置不是project的。
2:是de开头的greendao。(我这里用的是这个)
compile 'de.greenrobot:greendao:2.1.0'
②:在sourceSets 添加java.srcDirs配置。该路径主要是greendao对象的保存路径。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src/main/java','src/main/java-gen']
}
}
③:在app Module中main文件夹下新建Java-gen文件夹。
只添加这两处,app已经添加greendao的依赖配置。
2.新建数据库及相应表。
①:在该项目中新建一个Java Lib(是Java Lib,是Java Lib,是Java Lib重要的事情说三遍)
具体不多说,如果不会创建Java Lib的请自行度娘。
②:在该Java Lib中的build.gradle添加dependencies。
compile ‘de.greenrobot:greendao-generator:2.1.0’
apply plugin: 'java'
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'de.greenrobot:greendao-generator:2.1.0'
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
③:在新建的Java Lib中,新建一个Java Class.用来新建数据库和相应的表。具体不多说。
public class MyClass {
private static Entity search;
public static void main(String[] args){
try {
// 第一个参数:数据库版本号;第二个参数:将生成的实体类放到哪个包下
Schema schema = new Schema(1, "Bean");
// 将生成的DaoMaster、DaoSession和Dao类放到哪个包下
schema.setDefaultJavaPackageDao("dao");
// 将单元测试文件放到哪个包下
//schema.setDefaultJavaPackageTest("test");
// 初始化数据表
initSearchTable(schema);
// initArticleTable(schema);
// 自动生成代码及路径,放在开始新建的java-gen目录下
new DaoGenerator().generateAll(schema, "app/src/main/java-gen");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void initSearchTable(Schema schema) {
search = schema.addEntity("SearchBean"); // 对象bean名称
search.setTableName(Default.TABLE_HISTORY_SEARCH); // 对象关联的表名
search.addIdProperty().autoincrement(); // 添加主键字段
search.addStringProperty(Default.TABLE_SEARCH_VALUE); // 添加一个字符串类型的字段,内容
search.addStringProperty(Default.TABLE_SEARCH_ADDRESS); // 添加一个字符串类型的字段,地址
search.addStringProperty(Default.TABLE_SEARCH_TIME); // 时间
}
}
④:运行新建的Java Class。
如果没有问题,运行结果就会显示:Process finished with exit code 0。
app Module中的java-gen下也会生成相应的bean和dao。
3:接下来就是最重要的数据库表操作了。
创建数据库管理对象MyDaoManager 。
public class MyDaoManager {
private DaoSession session;
private String Db_Name = "Park";
private static MyDaoManager instance;
private MyDaoManager(Context context) {
try {
MyDatabaseHelper helper = new MyDatabaseHelper(context, Db_Name, null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
session = daoMaster.newSession();
} catch (Exception e) {
e.printStackTrace();
}
}
public static MyDaoManager getInstance(Context context) {
if (instance == null) {
instance = new MyDaoManager(context);
}
return instance;
}
public <T> AbstractDao getDao(Class<T> tClass){
if (tClass == SearchBean.class){
return session.getSearchBeanDao();
}else {
return null;
}
}
public List getAllData(AbstractDao dao) {
if (dao != null) {
return dao.loadAll();
}
return null;
}
/**
* 插入或更新
* @param dao
* @param bean
* @param <T>
*/
public<T> void insertData(AbstractDao dao,T bean) {
if (dao != null && bean != null) {
dao.insertOrReplace(bean);
}
}
// /**
// * 直接插入
// * @param dao
// * @param bean
// * @param <T>
// */
// public<T> void insertInTx(AbstractDao dao,T bean) {
// if (dao != null && bean != null) {
// dao.insert(bean);
// }
// }
public void deleteDataById(AbstractDao dao,long id) {
if (dao != null && String.valueOf(id)!= null) {
dao.deleteByKey(id);
}
}
}
相应的数据库新建,表创建,增删改查基本功能已经完善,如果需要查看详细文档,请自行度娘GreenDao官方文档。