zz greendao

注意:改了表结构后,

Schema schema = new Schema(2, "com.app.ouyl.chatwithlocation");
要更改版本,否则旧表不会更新。

http://www.cnblogs.com/jerehedu/p/4304766.html

http://www.open-open.com/lib/view/open1438065400878.html

http://www.2cto.com/kf/201604/498026.html

http://www.it165.net/pro/html/201401/9026.html

(二)创建表

1.创建一个实体类

 

Entity note = schema.addEntity("Note");

默认表名就是类名,也可以自定义表名

 

1.dao.setTableName("NoteList");

greenDAO会自动根据实体类属性创建表字段,并赋予默认值。例如在数据库方面的表名和列名都来源于实体类名和属性名。默认的数据库名称是大写使用下划线分隔单词,而不是在Java中使用的驼峰式大小写风格。例如,一个名为“CREATIONDATE”属性将成为一个数据库列“CREATION_DATE”。

 

设置一个自增长ID列为主键:

 

1.dao.addIdProperty().primaryKey().autoincrement();

 

设置其他各种类型的属性:

 

dao.addIntProperty("cityId");
dao.addStringProperty("infoType").notNull();//非null字段
dao.addDoubleProperty("Id");

在生成的实体类中,int类型为自动转为long类型。

如果在编译过程中出现以下错误,那么有可能是主键的类型错误所致:

1.java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

 

在使用greenDAO时,一个实体类只能对应一个表,目前没法做到一个表对应多个实体类,或者多个表共用一种对象类型。后续的升级也不会针对这一点进行扩展。

 

(二)表的增删改查

增删改查相当方便,完全的面向对象,不需要涉及到任何的sql语言。

1.查询

范例1:查询某个表是否包含某个id:

 

1.public boolean isSaved(int ID)
2.{
3.QueryBuilder<SaveList> qb = saveListDao.queryBuilder();
4.qb.where(Properties.Id.eq(ID));
5.qb.buildCount().count();
6.return qb.buildCount().count() > 0 true false;
7.}

 

范例2:获取整个表的数据集合,一句代码就搞定!

 

public List<PhotoGalleryDB> getPhotoGallery()
{
    return photoGalleryDao.loadAll();// 获取图片相册
}

 

范例3:通过一个字段值查找对应的另一个字段值(为简便直接使用下面方法,也许有更简单的方法,尚未尝试)

 

 

01./** 通过图片id查找其目录id */
02.public int getTypeId(int picId)
03.{
04.QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();
05.qb.where(Properties.Id.eq(picId));
06.if (qb.list().size() > 0)
07.{
08.return qb.list().get(0).getTypeId();
09.}
10.else
11.{
12.return -1;
13.}
14.}

 

范例4:查找所有第一姓名是“Joe”并且以lastname排序。

 

1.List joes = userDao.queryBuilder()
2..where(Properties.FirstName.eq("Joe"))
3..orderAsc(Properties.LastName)
4..list();

 

范例5:多重条件查询

(1)获取id为cityId并且infotype为HBContant.CITYINFO_SL的数据集合:

 

 

1.public List<CityInfoDB> getSupportingList(int cityId)
2.{
3.QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
4.qb.where(qb.and(Properties.CityId.eq(cityId),Properties.InfoType.eq(HBContant.CITYINFO_SL)));
5.qb.orderAsc(Properties.Id);// 排序依据
6.return qb.list();
7.}

 

(2)获取firstname为“Joe”并且出生于1970年10月以后的所有user集合:

 

1.QueryBuilder qb = userDao.queryBuilder();
2.qb.where(Properties.FirstName.eq("Joe"),
3.qb.or(Properties.YearOfBirth.gt(1970),
4.qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
5.List youngJoes = qb.list();

 

范例6:获取某列对象

1.picJsonDao.loadByRowId(picId);

 

 

2.增添/插入、修改

插入数据更加简单,也是只要一句代码便能搞定!

 

1.public void addToPhotoTable(Photo p)
2.{
3.photoDao.insert(p);
4.}

 

插入时需要new一个新的对象,范例如下:

 

1.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this"notes-db"null);
2.db = helper.getWritableDatabase();
3.daoMaster = new DaoMaster(db);
4.daoSession = daoMaster.newSession();
5.noteDao = daoSession.getNoteDao();
6.Note note = new Note(null, noteText, comment, new Date());
7.noteDao.insert(note);

 

修改更新:

1.photoDao.insertOrReplace(photo);
2.photoDao.insertInTx(photo);

 

3.删除:

(1)清空表格数据

 

1./** 清空相册图片列表的数据 */
2.public void clearPhoto()
3.{
4.photoDao.deleteAll();
5.}

 

(2)删除某个对象

1.public void deleteCityInfo(int cityId)
2.{
3.QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();
4.DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();
5.bd.executeDeleteWithoutDetachingEntities();
6.}

 

参考:https://github.com/greenrobot/greenDAO/issues/34

 

由上可见,使用greenDAO进行数据库的增删改查时及其方便,而且性能极佳。

 

(三)常用方法笔记

1.在Application实现得到DaoMaster和DaoSession的方法:

 

01.private static DaoMaster daoMaster;
02.private static DaoSession daoSession;
03./**
04.* 取得DaoMaster
05.*
06.* @param context
07.* @return
08.*/
09.public static DaoMaster getDaoMaster(Context context)
10.{
11.if (daoMaster == null)
12.{
13.OpenHelper helper = new DaoMaster.DevOpenHelper(context, HBContant.DATABASE_NAME, null);
14.daoMaster = new DaoMaster(helper.getWritableDatabase());
15.}
16.return daoMaster;
17.}
18./**
19.* 取得DaoSession
20.*
21.* @param context
22.* @return
23.*/
24.public static DaoSession getDaoSession(Context context)
25.{
26.if (daoSession == null)
27.{
28.if (daoMaster == null)
29.{
30.daoMaster = getDaoMaster(context);
31.}
32.daoSession = daoMaster.newSession();
33.}
34.return daoSession;
35.}

 

2.增删改查工具类:

01.public class DBHelper
02.{
03.private static Context mContext;
04.private static DBHelper instance;
05. 
06.private CityInfoDBDao cityInfoDao;
07. 
08.private DBHelper()
09.{
10.}
11. 
12.public static DBHelper getInstance(Context context)
13.{
14.if (instance == null)
15.{
16.instance = new DBHelper();
17.if (mContext == null)
18.{
19.mContext = context;
20.}
21. 
22.// 数据库对象
23.DaoSession daoSession = HBApplication.getDaoSession(mContext);
24.instance.cityInfoDao = daoSession.getCityInfoDBDao();
25.}
26.return instance;
27.}
28. 
29./** 添加数据 */
30.public void addToCityInfoTable(CityInfo item)
31.{
32.cityInfoDao.insert(item);
33.}
34. 
35./** 查询 */
36.public List<EstateLoveListJson> getCityInfoList()
37.{
38.QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
39.return qb.list();
40.}
41. 
42./** 查询 */
43.public List<CityInfo> getCityInfo()
44.{
45.return cityInfoDao.loadAll();// 查找图片相册
46.}
47. 
48./** 查询 */
49.public boolean isSaved(int Id)
50.{
51.QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
52.qb.where(Properties.Id.eq(Id));
53.qb.buildCount().count();
54.return qb.buildCount().count() > 0 true false;// 查找收藏表
55.}
56. 
57./** 删除 */
58.public void deleteCityInfoList(int Id)
59.{
60.QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
61.DeleteQuery<CityInfo> bd = qb.where(Properties.Id.eq(Id)).buildDelete();
62.bd.executeDeleteWithoutDetachingEntities();
63.}
64. 
65./** 删除 */
66.public void clearCityInfo()
67.{
68.cityInfoDao.deleteAll();
69.}
70. 
71./** 通过城市id查找其类型id */
72.public int getTypeId(int cityId)
73.{
74.QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();
75.qb.where(Properties.Id.eq(cityId));
76.if (qb.list().size() > 0)
77.{
78.return qb.list().get(0).getTypeId();
79.}
80.else
81.{
82.return 0;
83.}
84.}
85. 
86./** 多重查询 */
87.public List<CityInfo> getIphRegionList(int cityId)
88.{
89.QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
90.qb.where(qb.and(Properties.CityId.eq(cityId), Properties.InfoType.eq(HBContant.CITYINFO_IR)));
91.qb.orderAsc(Properties.Id);// 排序依据
92.return qb.list();
93.}
94.}

 

 

另外,还有多表关联、惰性加载等功能,待后续研究。

参考资料:

1.https://github.com/greenrobot/greenDAO

2.http://greendao-orm.com/documentation/how-to-get-started/

3.http://blog.csdn.net/krislight/article/details/9391455

目录:

一、概述

二、下载并解压greenDAO相关资源

三、应用greenDAO框架

  1、创建Java工程

  2、添加类库支持

  3、创建类

四、代码分析

五、使用greenDAO

六、源码下载

一、概述

  Android开发中对数据的存储和操作是避免不了的,为此android平台为我们提供了多种存储数据的方式,如文件、SharedPreferences、SQLite等。每种数据存储方式各有不同特点,适用不同场景,其中SQLite应用的较多。Android虽然提供了SQLiteDatabase、SQLiteOpenHelper帮助我们进行数据库操作,但是在实际开发中应用起来是很繁琐的,那么有没有更加方便、简洁的方式来操作SQLite数据库呢?答案是肯定的,那就是ORM框架。

  现在应用于android平台中的orm框架还是比较多的,如greenDAO、ormlite、ActiveAndroid、SugarORM等,其中greenDAO运行效率最高、内存消耗最少。下面我们就来看看greenDAO的具体用法。

二、下载并解压greenDAO相关资源

  通过官网,可以获取greenDAO的相关资源,官网地址:http://greendao-orm.com/ 。

  通过上述地址,将greenDAO相关资源下载解压后,可得到六个相关的项目工程:

1、  DaoCore:greenDAO的核心库。

2、  DaoExample:greenDAO使用范例项目。

3、  DaoExampleGenerator:greenDAO使用范例的实体类及DAO组件的生成器项目。

4、  DaoGenerator:greenDAO的DAO组件生成器项目。

5、  DaoTest:greenDAO的测试项目。

6、  PerformanceTestOrmLite:ormlite框架性能测试项目

 

三、应用greenDAO框架

  获取资源后,我们来看看如何在我们的android项目中应用greenDAO框架。结合官网文档和范例可知android项目中用到的实体及greenDAO的DAO组件需要又DAO组件生成器工程来生成。DAO组件生成器工程创建及相关代码具体如下:

1、创建Java工程 

  使用MyEclipse创建一个普通的java工程,工程名为:JREDU_DAOGENERATOR。注意是java工程而不是一个android工程。

2、为工程JREDU_DAOGENERATOR添加类库支持

  为工程JREDU_DAOGENERATOR添加类库支持:greenDAO-generator.jar和freemarker.jar。

  a) Freemaker.jar可通过此地址进行下载:http://jaist.dl.sourceforge.net/project/freemarker/freemarker/2.3.21/freemarker-2.3.21.tar.gz

  b) greenDAO-generator.jar可通过DaoGenerator导出。只需要导出src和src-template两个目录即可

3、在工程JREDU_DAOGENERATOR创建类JREDUDaoGenerator

  在工程JREDU_DAOGENERATOR创建类JREDUDaoGenerator,具体编码如下:

复制代码
public static void main(String[] args) throws IOException, Exception {
        Schema schema = new Schema(1, "com.jredu.entity");
        //实体类
        Entity employee = schema.addEntity("Employee");
        employee.addIdProperty(); //主键
        employee.addStringProperty("name");
        employee.addDateProperty("hireDate");
        //生成
    new  DaoGenerator()
.generateAll(schema,"E:\\android_space\\JREDU_GREENDAO\\src");
    }
复制代码

  运行代码,在控制台可见如下图结果:

 

  打开上图中的目录,我们可以看到此工程为我们生成了4个文件,分别为EmployeeDao、Employee、DaoMaster、DaoSession,文件的内容和作用,后文在做介绍。

  通过以上步骤,我们完了实体类和DAO组件的生成,下面我们来分析下代码中涉及的类及它们的作用。

四、代码分析

   Schema,模式,通过源码我们可以看到此类的一些属性,如:

Private final int version:代表构建数据库的版本号。

Private final String defaultJavaPackage:代表生成实体类的默认包。

Private final List<Entity> entities:存放Entity的集合。

  因此我们也可以把Schema看做是存放实体的容器。

  通过构造函数:Schema schema = new Schema(1, "com.jredu.entity");我们创建了一个模式,参数1代表数据库的版本号,”com.jredu.entity”代表生成的java类的包,同时也是生成类存放路径的一部分。

  通过方法:Entity employee = schema.addEntity("Employee");创建了一个类名为Employee的Entity对象,并将其添加到schema对象的entities集合属性中。

  Property:实体属性的模型,用于关联实体属性和表的列。

  ToOne、ToMany:用于关联关系映射。

  Entity实体的模型,可用于将实体类映射到对应的表。主要属性有className、tableName、属性、索引、关系等内容,具体请查看源码

Schema、Entity、Property、Index、ToOne、ToMany关系图:

  DaoGenerator:实体类和DAO组件的生成器,generateAll根据schema和目录参数,首先生成文件存放目录,并从schema中取出所有entity,根据freemaker模板生成对应的实体了和DAO组件。

五、使用greenDAO

  相关组件已经生成,下面我们继续介绍,如何在android项目中使用greenDAO,过程如下:

1、 创建android工程,工程名:JREDU_GREENDAO。

2、 创建包名,与上面构建的Schema中的包名一致。本文案例直接将实体类和DAO组件的生成到本工程下。

3、为JREDU_GREENDAO添加greenDAO的jar。可以从工程DaoExample中拷贝。

4、主要代码如下:

  对象声明部分:

private DaoMaster daoMaster;
private DaoSession daoSession;
private EmployeeDao employeeDao;
private SQLiteDatabase db;

  对象的创建部分:

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "jredu.db", null);
    db = helper.getWritableDatabase();
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
employeeDao = daoSession.getEmployeeDao();

  添加功能:

复制代码
String name = this.content.getText().toString();
      if(TextUtils.isEmpty(name)){
         Toast.makeText(this, "请输入员工姓名!", Toast.LENGTH_SHORT).show();
         return;
     }
     Employee emp = new Employee(null, name, new Date());
     long empId = employeeDao.insert(emp);
     this.show.setText("新增员工的编号:"+empId+","+emp.getId());
     //一次插入多个对象
     List<Employee> list = new ArrayList<Employee>();
     list.add(new Employee(null, "李四", new Date()));
     list.add(new Employee(null, "王五", new Date()));
            
     employeeDao.insertInTx(list, true);
     StringBuilder sb = new StringBuilder("批量新增成功后的员工编号:");
     for(Employee e:list){
         sb.append(e.getId());
     }
     this.show.setText(this.show.getText()+","+sb.toString());
复制代码

         查询部分:

复制代码
 List<Employee> emps= employeeDao.loadAll();
 StringBuilder empStr = new StringBuilder();
 for(Employee e: emps){
     empStr.append("编号:").append(e.getId()).append(",姓名:").append(e.getName()).append(",雇佣日期:").append(e.getHireDate());
 }
 this.show.setText(empStr.toString());
复制代码

  最终效果图如下:

  从代码中,我们看到功能的实现主要使用了Employee、EmployeeDao、DaoMaster、DaoSession。

Employee:实体对象,映射到表EMPLOYEE。

EmployeeDAO:通过代码可知此类提供了生成建表、和删表的方法,并类继承了AbstractDao(greenDAO核心类之一,封装了操作表中数据的各种方法)。

DaoMaster:继承自AbstractDaoMaster,用于创建数据库,并管理数据库连接。

DaoSession:继承自AbstractDaoSession,所有DAO对象的入口,通过此类可获得实体了的DAO组件。

 

六、源码下载

  以上是geenDAO的基本使用过程,DAO组件中的方法、多表关联等在后续文章中继续讲解。

  如有疑问,可下载源码查看详细内容,也可直接评论咨询哦!

posted on 2016-06-12 22:46  oyl  阅读(203)  评论(0)    收藏  举报

导航