greenDaoMaster的学习研究

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

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

示例代码如下:

[java] view plain copy
  1. /*
  2. *Copyright(C)2011MarkusJunginger,greenrobot(http://greenrobot.de)
  3. *
  4. *LicensedundertheApacheLicense,Version2.0(the"License");
  5. *youmaynotusethisfileexceptincompliancewiththeLicense.
  6. *YoumayobtainacopyoftheLicenseat
  7. *
  8. *http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
  11. *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
  12. *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
  13. *SeetheLicenseforthespecificlanguagegoverningpermissionsand
  14. *limitationsundertheLicense.
  15. */
  16. packagede.greenrobot.daogenerator.gentest;
  17. importde.greenrobot.daogenerator.DaoGenerator;
  18. importde.greenrobot.daogenerator.Entity;
  19. importde.greenrobot.daogenerator.Property;
  20. importde.greenrobot.daogenerator.Schema;
  21. importde.greenrobot.daogenerator.ToMany;
  22. /**
  23. *GeneratesentitiesandDAOsfortheexampleprojectDaoExample.
  24. *
  25. *RunitasaJavaapplication(notAndroid).
  26. *
  27. *@authorMarkus
  28. */
  29. publicclassExampleDaoGenerator{
  30. publicstaticvoidmain(String[]args)throwsException{
  31. Schemaschema=newSchema(3,"de.greenrobot.daoexample");
  32. addNote(schema);
  33. addCustomerOrder(schema);
  34. newDaoGenerator().generateAll(schema,"../DaoExample/src-gen");
  35. }
  36. privatestaticvoidaddNote(Schemaschema){
  37. Entitynote=schema.addEntity("Note");
  38. note.addIdProperty();
  39. note.addStringProperty("text").notNull();
  40. note.addStringProperty("comment");
  41. note.addDateProperty("date");
  42. }
  43. privatestaticvoidaddCustomerOrder(Schemaschema){
  44. Entitycustomer=schema.addEntity("Customer");
  45. customer.addIdProperty();
  46. customer.addStringProperty("name").notNull();
  47. Entityorder=schema.addEntity("Order");
  48. order.setTableName("ORDERS");//"ORDER"isareservedkeyword
  49. order.addIdProperty();
  50. PropertyorderDate=order.addDateProperty("date").getProperty();
  51. PropertycustomerId=order.addLongProperty("customerId").notNull().getProperty();
  52. order.addToOne(customer,customerId);
  53. ToManycustomerToOrders=customer.addToMany(order,customerId);
  54. customerToOrders.setName("orders");
  55. customerToOrders.orderAsc(orderDate);
  56. }
  57. }
来分析这段代码:

[java] view plain copy
  1. Schemaschema=newSchema(3,"de.greenrobot.daoexample");

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

在来看这段代码

[java] view plain copy
  1. Entitynote=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. newDaoGenerator().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. greenDAOGenerator
  2. Copyright2011-2013MarkusJunginger,greenrobot.de.LicensedunderGPLV3.
  3. ThisprogramcomeswithABSOLUTELYNOWARRANTY
  4. Processingschemaversion3...
  5. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\NoteDao.java
  6. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Note.java
  7. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\CustomerDao.java
  8. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Customer.java
  9. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\OrderDao.java
  10. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Order.java
  11. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoMaster.java
  12. WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoSession.java
  13. Processed3entitiesin7743ms

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

来看看如何使用GreenDao实现CRUD

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

[java] view plain copy
  1. DevOpenHelperhelper=newDaoMaster.DevOpenHelper(this,"notes-db",null);
  2. db=helper.getWritableDatabase();
  3. daoMaster=newDaoMaster(db);
  4. daoSession=daoMaster.newSession();
  5. noteDao=daoSession.getNoteDao();
  6. Notenote=newNote(null,noteText,comment,newDate());
  7. noteDao.insert(note);
代码变得如此简单。

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

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

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

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

[java] view plain copy
  1. publicclassBaseApplicationextendsApplication{
  2. privatestaticBaseApplicationmInstance;
  3. privatestaticDaoMasterdaoMaster;
  4. privatestaticDaoSessiondaoSession;
  5. @Override
  6. publicvoidonCreate(){
  7. super.onCreate();
  8. if(mInstance==null)
  9. mInstance=this;
  10. }
  11. /**
  12. *取得DaoMaster
  13. *
  14. *@paramcontext
  15. *@return
  16. */
  17. publicstaticDaoMastergetDaoMaster(Contextcontext){
  18. if(daoMaster==null){
  19. OpenHelperhelper=newDaoMaster.DevOpenHelper(context,Constants.DB_NAME,null);
  20. daoMaster=newDaoMaster(helper.getWritableDatabase());
  21. }
  22. returndaoMaster;
  23. }
  24. /**
  25. *取得DaoSession
  26. *
  27. *@paramcontext
  28. *@return
  29. */
  30. publicstaticDaoSessiongetDaoSession(Contextcontext){
  31. if(daoSession==null){
  32. if(daoMaster==null){
  33. daoMaster=getDaoMaster(context);
  34. }
  35. daoSession=daoMaster.newSession();
  36. }
  37. returndaoSession;
  38. }
  39. }

然后写一个Db工具类:

[java] view plain copy
  1. publicclassDbService{
  2. privatestaticfinalStringTAG=DbService.class.getSimpleName();
  3. privatestaticDbServiceinstance;
  4. privatestaticContextappContext;
  5. privateDaoSessionmDaoSession;
  6. privateNoteDaonoteDao;
  7. privateDbService(){
  8. }
  9. publicstaticDbServicegetInstance(Contextcontext){
  10. if(instance==null){
  11. instance=newDbService();
  12. if(appContext==null){
  13. appContext=context.getApplicationContext();
  14. }
  15. instance.mDaoSession=BaseApplication.getDaoSession(context);
  16. instance.noteDao=instance.mDaoSession.getNoteDao();
  17. }
  18. returninstance;
  19. }
  20. publicNoteloadNote(longid){
  21. returnnoteDao.load(id);
  22. }
  23. publicList<Note>loadAllNote(){
  24. returnnoteDao.loadAll();
  25. }
  26. /**
  27. *querylistwithwhereclause
  28. *ex:begin_date_time>=?ANDend_date_time<=?
  29. *@paramwherewhereclause,include'where'word
  30. *@paramparamsqueryparameters
  31. *@return
  32. */
  33. publicList<Note>queryNote(Stringwhere,String...params){
  34. returnnoteDao.queryRaw(where,params);
  35. }
  36. /**
  37. *insertorupdatenote
  38. *@paramnote
  39. *@returninsertorupdatenoteid
  40. */
  41. publiclongsaveNote(Notenote){
  42. returnnoteDao.insertOrReplace(note);
  43. }
  44. /**
  45. *insertorupdatenoteListusetransaction
  46. *@paramlist
  47. */
  48. publicvoidsaveNoteLists(finalList<Note>list){
  49. if(list==null||list.isEmpty()){
  50. return;
  51. }
  52. noteDao.getSession().runInTx(newRunnable(){
  53. @Override
  54. publicvoidrun(){
  55. for(inti=0;i<list.size();i++){
  56. Notenote=list.get(i);
  57. noteDao.insertOrReplace(note);
  58. }
  59. }
  60. });
  61. }
  62. /**
  63. *deleteallnote
  64. */
  65. publicvoiddeleteAllNote(){
  66. noteDao.deleteAll();
  67. }
  68. /**
  69. *deletenotebyid
  70. *@paramid
  71. */
  72. publicvoiddeleteNote(longid){
  73. noteDao.deleteByKey(id);
  74. Log.i(TAG,"delete");
  75. }
  76. publicvoiddeleteNote(Notenote){
  77. noteDao.delete(note);
  78. }
  79. }

DB常量:

[java] view plain copy
  1. publicclassConstants{
  2. publicstaticfinalStringDB_NAME="note_db";
  3. }

Note实体类:

[java] view plain copy
  1. //THISCODEISGENERATEDBYgreenDAO,DONOTEDIT.Enable"keep"sectionsifyouwanttoedit.
  2. /**
  3. *Entitymappedtotablenote.
  4. */
  5. publicclassNote{
  6. privateLongid;
  7. /**Not-nullvalue.*/
  8. privateStringtitle;
  9. /**Not-nullvalue.*/
  10. privateStringcontent;
  11. privatejava.util.DatecreateDate;
  12. publicNote(){
  13. }
  14. publicNote(Longid){
  15. this.id=id;
  16. }
  17. publicNote(Longid,Stringtitle,Stringcontent,java.util.DatecreateDate){
  18. this.id=id;
  19. this.title=title;
  20. this.content=content;
  21. this.createDate=createDate;
  22. }
  23. publicLonggetId(){
  24. returnid;
  25. }
  26. publicvoidsetId(Longid){
  27. this.id=id;
  28. }
  29. /**Not-nullvalue.*/
  30. publicStringgetTitle(){
  31. returntitle;
  32. }
  33. /**Not-nullvalue;ensurethisvalueisavailablebeforeitissavedtothedatabase.*/
  34. publicvoidsetTitle(Stringtitle){
  35. this.title=title;
  36. }
  37. /**Not-nullvalue.*/
  38. publicStringgetContent(){
  39. returncontent;
  40. }
  41. /**Not-nullvalue;ensurethisvalueisavailablebeforeitissavedtothedatabase.*/
  42. publicvoidsetContent(Stringcontent){
  43. this.content=content;
  44. }
  45. publicjava.util.DategetCreateDate(){
  46. returncreateDate;
  47. }
  48. publicvoidsetCreateDate(java.util.DatecreateDate){
  49. this.createDate=createDate;
  50. }
  51. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值