文档章节

greenDaoMaster的学习研究

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:44
字数 1414
阅读 15
收藏 0

最近一直在研究一个第三方的开源框架,greenDaoMaster是一个移动开发的ORM框架,由于网上一直查不到使用资料,所以自己摸索总结下用法。

首先需要新建一个JAVA项目用来自动生成文件。需要导入greendao-generator-1.3.0.jar和freemarker.jar到项目中

示例代码如下:

[java]  view plain copy
  1. /* 
  2.  * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de) 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16. package de.greenrobot.daogenerator.gentest;  
  17.   
  18. import de.greenrobot.daogenerator.DaoGenerator;  
  19. import de.greenrobot.daogenerator.Entity;  
  20. import de.greenrobot.daogenerator.Property;  
  21. import de.greenrobot.daogenerator.Schema;  
  22. import de.greenrobot.daogenerator.ToMany;  
  23.   
  24. /** 
  25.  * Generates entities and DAOs for the example project DaoExample. 
  26.  *  
  27.  * Run it as a Java application (not Android). 
  28.  *  
  29.  * @author Markus 
  30.  */  
  31. public class ExampleDaoGenerator {  
  32.   
  33.     public static void main(String[] args) throws Exception {  
  34.           
  35.         Schema schema = new Schema(3"de.greenrobot.daoexample");  
  36.   
  37.         addNote(schema);  
  38.         addCustomerOrder(schema);  
  39.   
  40.         new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");  
  41.     }  
  42.   
  43.     private static void addNote(Schema schema) {  
  44.         Entity note = schema.addEntity("Note");  
  45.         note.addIdProperty();  
  46.         note.addStringProperty("text").notNull();  
  47.         note.addStringProperty("comment");  
  48.         note.addDateProperty("date");  
  49.     }  
  50.   
  51.     private static void addCustomerOrder(Schema schema) {  
  52.         Entity customer = schema.addEntity("Customer");  
  53.         customer.addIdProperty();  
  54.         customer.addStringProperty("name").notNull();  
  55.   
  56.         Entity order = schema.addEntity("Order");  
  57.         order.setTableName("ORDERS"); // "ORDER" is a reserved keyword  
  58.         order.addIdProperty();  
  59.         Property orderDate = order.addDateProperty("date").getProperty();  
  60.         Property customerId = order.addLongProperty("customerId").notNull().getProperty();  
  61.         order.addToOne(customer, customerId);  
  62.   
  63.         ToMany customerToOrders = customer.addToMany(order, customerId);  
  64.         customerToOrders.setName("orders");  
  65.         customerToOrders.orderAsc(orderDate);  
  66.     }  
  67.   
  68. }  
来分析这段代码:

[java]  view plain copy
  1. Schema schema = new Schema(3"de.greenrobot.daoexample");  

Schema对象接受2个参数,第一个参数是DB的版本号,通过更新版本号来更新数据库。第二个参数是自动生成代码的包路径。包路径系统自动生成

在来看这段代码

[java]  view plain copy
  1. Entity note = schema.addEntity("Note");  
  2.         note.addIdProperty();  
  3.         note.addStringProperty("text").notNull();  
  4.         note.addStringProperty("comment");  
  5.         note.addDateProperty("date");  

Entity表示一个实体可以对应成数据库中的表

系统自动会以传入的参数作为表的名字,这里表名就是NOTE

当然也可以自己设置表的名字,像这样:

[java]  view plain copy
  1. order.setTableName("ORDERS");  

接下来是一些字段参数设置。

如果想ID自动增长可以像这样:

[java]  view plain copy
  1. order.addIdProperty().autoincrement();  

再来看这一段:

[java]  view plain copy
  1. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");  

第一个参数是Schema对象,第二个参数是希望自动生成的代码对应的项目路径。

试了下src-gen这个文件夹必须手动创建,这里路径如果错了会抛出异常。

好了先别慌运行这段程序。新建一个Android项目名字是DaoExample,和刚才的JAVA项目保持在同一个文件夹下。

接着就可以运行刚才的JAVA程序,会看到src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,

1个DaoSession

[java]  view plain copy
  1. greenDAO Generator  
  2. Copyright 2011-2013 Markus Junginger, greenrobot.de. Licensed under GPL V3.  
  3. This program comes with ABSOLUTELY NO WARRANTY  
  4. Processing schema version 3...  
  5. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\NoteDao.java  
  6. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Note.java  
  7. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\CustomerDao.java  
  8. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Customer.java  
  9. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\OrderDao.java  
  10. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Order.java  
  11. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoMaster.java  
  12. Written D:\android workspace\Open Source\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoSession.java  
  13. Processed 3 entities in 7743ms  

可以看到DaoMaster中封装了SQLiteDatabase和SQLiteOpenHelper

来看看如何使用GreenDao实现CRUD

如下代码实现插入一个Note对象:

[java]  view plain copy
  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);  
代码变得如此简单。

官方推荐将取得DaoMaster对象的方法放到Application层这样避免多次创建生成Session对象。

感觉这个框架和Web的Hibernate有异曲同工之妙。

这里列出自己实际开发中的代码方便记忆:

首先是在Application层实现得到DaoMaster和DaoSession的方法:

[java]  view plain copy
  1. public class BaseApplication extends Application {  
  2.       
  3.     private static BaseApplication mInstance;  
  4.     private static DaoMaster daoMaster;  
  5.     private static DaoSession daoSession;  
  6.       
  7.     @Override  
  8.     public void onCreate() {  
  9.         super.onCreate();  
  10.         if(mInstance == null)  
  11.             mInstance = this;  
  12.     }  
  13.       
  14.     /** 
  15.      * 取得DaoMaster 
  16.      *  
  17.      * @param context 
  18.      * @return  
  19.      */  
  20.     public static DaoMaster getDaoMaster(Context context) {  
  21.         if (daoMaster == null) {  
  22.             OpenHelper helper = new DaoMaster.DevOpenHelper(context,Constants.DB_NAME, null);  
  23.             daoMaster = new DaoMaster(helper.getWritableDatabase());  
  24.         }  
  25.         return daoMaster;  
  26.     }  
  27.       
  28.     /** 
  29.      * 取得DaoSession 
  30.      *  
  31.      * @param context 
  32.      * @return 
  33.      */  
  34.     public static DaoSession getDaoSession(Context context) {  
  35.         if (daoSession == null) {  
  36.             if (daoMaster == null) {  
  37.                 daoMaster = getDaoMaster(context);  
  38.             }  
  39.             daoSession = daoMaster.newSession();  
  40.         }  
  41.         return daoSession;  
  42.     }  
  43. }  

然后写一个Db工具类:

[java]  view plain copy
  1. public class DbService {  
  2.       
  3.     private static final String TAG = DbService.class.getSimpleName();  
  4.     private static DbService instance;  
  5.     private static Context appContext;  
  6.     private DaoSession mDaoSession;  
  7.     private NoteDao noteDao;  
  8.       
  9.       
  10.     private DbService() {  
  11.     }  
  12.   
  13.     public static DbService getInstance(Context context) {  
  14.         if (instance == null) {  
  15.             instance = new DbService();  
  16.             if (appContext == null){  
  17.                 appContext = context.getApplicationContext();  
  18.             }  
  19.             instance.mDaoSession = BaseApplication.getDaoSession(context);  
  20.             instance.noteDao = instance.mDaoSession.getNoteDao();  
  21.         }  
  22.         return instance;  
  23.     }  
  24.       
  25.       
  26.     public Note loadNote(long id) {  
  27.         return noteDao.load(id);  
  28.     }  
  29.       
  30.     public List<Note> loadAllNote(){  
  31.         return noteDao.loadAll();  
  32.     }  
  33.       
  34.     /** 
  35.      * query list with where clause 
  36.      * ex: begin_date_time >= ? AND end_date_time <= ? 
  37.      * @param where where clause, include 'where' word 
  38.      * @param params query parameters 
  39.      * @return 
  40.      */  
  41.       
  42.     public List<Note> queryNote(String where, String... params){  
  43.         return noteDao.queryRaw(where, params);  
  44.     }  
  45.       
  46.       
  47.     /** 
  48.      * insert or update note 
  49.      * @param note 
  50.      * @return insert or update note id 
  51.      */  
  52.     public long saveNote(Note note){  
  53.         return noteDao.insertOrReplace(note);  
  54.     }  
  55.       
  56.       
  57.     /** 
  58.      * insert or update noteList use transaction 
  59.      * @param list 
  60.      */  
  61.     public void saveNoteLists(final List<Note> list){  
  62.             if(list == null || list.isEmpty()){  
  63.                  return;  
  64.             }  
  65.             noteDao.getSession().runInTx(new Runnable() {  
  66.             @Override  
  67.             public void run() {  
  68.                 for(int i=0; i<list.size(); i++){  
  69.                     Note note = list.get(i);  
  70.                     noteDao.insertOrReplace(note);  
  71.                 }  
  72.             }  
  73.         });  
  74.           
  75.     }  
  76.       
  77.     /** 
  78.      * delete all note 
  79.      */  
  80.     public void deleteAllNote(){  
  81.         noteDao.deleteAll();  
  82.     }  
  83.       
  84.     /** 
  85.      * delete note by id 
  86.      * @param id 
  87.      */  
  88.     public void deleteNote(long id){  
  89.         noteDao.deleteByKey(id);  
  90.         Log.i(TAG, "delete");  
  91.     }  
  92.       
  93.     public void deleteNote(Note note){  
  94.         noteDao.delete(note);  
  95.     }  
  96.       
  97. }  

DB常量:

[java]  view plain copy
  1. public class Constants {  
  2.     public static final String DB_NAME = "note_db";  
  3. }  

Note实体类:

[java]  view plain copy
  1. // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.   
  2. /** 
  3.  * Entity mapped to table note. 
  4.  */  
  5. public class Note {  
  6.   
  7.     private Long id;  
  8.     /** Not-null value. */  
  9.     private String title;  
  10.     /** Not-null value. */  
  11.     private String content;  
  12.     private java.util.Date createDate;  
  13.   
  14.     public Note() {  
  15.     }  
  16.   
  17.     public Note(Long id) {  
  18.         this.id = id;  
  19.     }  
  20.   
  21.     public Note(Long id, String title, String content, java.util.Date createDate) {  
  22.         this.id = id;  
  23.         this.title = title;  
  24.         this.content = content;  
  25.         this.createDate = createDate;  
  26.     }  
  27.   
  28.     public Long getId() {  
  29.         return id;  
  30.     }  
  31.   
  32.     public void setId(Long id) {  
  33.         this.id = id;  
  34.     }  
  35.   
  36.     /** Not-null value. */  
  37.     public String getTitle() {  
  38.         return title;  
  39.     }  
  40.   
  41.     /** Not-null value; ensure this value is available before it is saved to the database. */  
  42.     public void setTitle(String title) {  
  43.         this.title = title;  
  44.     }  
  45.   
  46.     /** Not-null value. */  
  47.     public String getContent() {  
  48.         return content;  
  49.     }  
  50.   
  51.     /** Not-null value; ensure this value is available before it is saved to the database. */  
  52.     public void setContent(String content) {  
  53.         this.content = content;  
  54.     }  
  55.   
  56.     public java.util.Date getCreateDate() {  
  57.         return createDate;  
  58.     }  
  59.   
  60.     public void setCreateDate(java.util.Date createDate) {  
  61.         this.createDate = createDate;  
  62.     }  
  63.   
  64. }  

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/38026813

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
腾讯 AI Lab 主任张潼博士:机器学习里的优化问题

雷锋网 AI 科技评论按,日前,在由上海财经大学交叉科学研究院(RIIS)主办,杉数科技有限公司协办的「现代运筹学发展讨论会」上,腾讯 AI Lab(腾讯人工智能实验室)主任张潼博士发表了精彩...

思颖
2018/01/10
0
0
智能卡开发的相关总结

1.EMV技术学习和研究(一)开篇(http://blog.csdn.net/xuture/article/details/9208259) 2.EMV技术学习和研究(二)应用选择(http://blog.csdn.net/xuture/article/details/9250067) 3.EMV技......

IT追寻者
2016/09/08
4
0
学习东西总结:

一.JAVA 基础 1、JAVA并发编程 2.JAVA NIO系列 3.JVM深入了解 4.JAVA性能优化相关研究 5.JAVA7,8新特性 二、数据库 1.数据库优化研究 2.MYSQL高可用性研究 3.MYSQL源码研究 三、网络 1.HTTP...

QH_C
2016/03/25
5
0
跟风Google Brain,Facebook AI研究机构启动见习项目

2015年,Google Brain公布了其帮助机器学习研究者进阶的见习项目,研究内容灵活、薪资福利又高、发展机会应有尽有,瞬间吸引了大量的申请者,其中甚至还有Node.js之父Ryan Dahl,AI科技大本营...

dqcfkyqdxym3f8rb0
2017/12/06
0
0
这些人你还不认识?!一文带你有姿势地侃深度学习大佬

大数据文摘作品 编译:余志文,笪洁琼,钱天培 近几年间,深度学习的兴起造就了一批超级巨星。一向在学术界默默无闻的大佬们,相继成为了业界的领头人,而他们的声名也再从业界一路传至大众耳...

uwr44uouqcnsuqb60zk2
2017/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HBase新建表报错 org.apache.hadoop.hbase.TableExistsException

之前安装了旧版本的hbase, 没有清理其在Zookeeper上的内容。 解决办法 stop-hbase.sh zkCli.sh >>> rmr /hbase >>> quit start-hbase.sh...

dreamness
7分钟前
0
0
大数据技术的应用现状与展望

本文是我即将由嵌入式底层驱动行业转入大数据研究领域的综述文章,案例摘自《程序员》电子期刊,由于初学者知识面较窄,查看文献量较少,因此后续还会在此基础上,继续跟踪并深入研究,为论文...

陈小君
14分钟前
0
0
NCRE考试感想 三级信息安全(上)

时间节点 报名时间:2017-06 考试时间:2017-09 查询成绩:2017-11   考试简述 满分100分,时间120分钟。题型有三种,选择题、综合题、应用题。   备考经验 题库是WLJY的,买了激活码。为了...

志成就
21分钟前
0
0
百度地图显示我的位置

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><script type="text/javascript" src="jquery-1.8.2.min.js"></script></head><body><sec......

塔塔米
25分钟前
0
0
mysql mysql常用的常用函数

1. 数学函数 函 数 作 用 ABS(x) 返回x的绝对值 CEIL(x),CEILIN(x) 返回不小于x的最小整数值 FLOOR(x) 返回不大于x的最大整数值 RAND() 返回0~1的随机数 RAND(x) 返回0~1的随机数,x值相同返...

edison_kwok
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部