最近一直在研究一个第三方的开源框架,greenDaoMaster是一个移动开发的ORM框架,由于网上一直查不到使用资料,所以自己摸索总结下用法。
首先需要新建一个JAVA项目用来自动生成文件。需要导入greendao-generator-1.3.0.jar和freemarker.jar到项目中
示例代码如下:
- /*
- *Copyright(C)2011MarkusJunginger,greenrobot(http://greenrobot.de)
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");
- *youmaynotusethisfileexceptincompliancewiththeLicense.
- *YoumayobtainacopyoftheLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
- *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
- *SeetheLicenseforthespecificlanguagegoverningpermissionsand
- *limitationsundertheLicense.
- */
- packagede.greenrobot.daogenerator.gentest;
- importde.greenrobot.daogenerator.DaoGenerator;
- importde.greenrobot.daogenerator.Entity;
- importde.greenrobot.daogenerator.Property;
- importde.greenrobot.daogenerator.Schema;
- importde.greenrobot.daogenerator.ToMany;
- /**
- *GeneratesentitiesandDAOsfortheexampleprojectDaoExample.
- *
- *RunitasaJavaapplication(notAndroid).
- *
- *@authorMarkus
- */
- publicclassExampleDaoGenerator{
- publicstaticvoidmain(String[]args)throwsException{
- Schemaschema=newSchema(3,"de.greenrobot.daoexample");
- addNote(schema);
- addCustomerOrder(schema);
- newDaoGenerator().generateAll(schema,"../DaoExample/src-gen");
- }
- privatestaticvoidaddNote(Schemaschema){
- Entitynote=schema.addEntity("Note");
- note.addIdProperty();
- note.addStringProperty("text").notNull();
- note.addStringProperty("comment");
- note.addDateProperty("date");
- }
- privatestaticvoidaddCustomerOrder(Schemaschema){
- Entitycustomer=schema.addEntity("Customer");
- customer.addIdProperty();
- customer.addStringProperty("name").notNull();
- Entityorder=schema.addEntity("Order");
- order.setTableName("ORDERS");//"ORDER"isareservedkeyword
- order.addIdProperty();
- PropertyorderDate=order.addDateProperty("date").getProperty();
- PropertycustomerId=order.addLongProperty("customerId").notNull().getProperty();
- order.addToOne(customer,customerId);
- ToManycustomerToOrders=customer.addToMany(order,customerId);
- customerToOrders.setName("orders");
- customerToOrders.orderAsc(orderDate);
- }
- }
- Schemaschema=newSchema(3,"de.greenrobot.daoexample");
Schema对象接受2个参数,第一个参数是DB的版本号,通过更新版本号来更新数据库。第二个参数是自动生成代码的包路径。包路径系统自动生成
在来看这段代码
- Entitynote=schema.addEntity("Note");
- note.addIdProperty();
- note.addStringProperty("text").notNull();
- note.addStringProperty("comment");
- note.addDateProperty("date");
Entity表示一个实体可以对应成数据库中的表
系统自动会以传入的参数作为表的名字,这里表名就是NOTE
当然也可以自己设置表的名字,像这样:
- order.setTableName("ORDERS");
接下来是一些字段参数设置。
如果想ID自动增长可以像这样:
- order.addIdProperty().autoincrement();
再来看这一段:
- newDaoGenerator().generateAll(schema,"../DaoExample/src-gen");
第一个参数是Schema对象,第二个参数是希望自动生成的代码对应的项目路径。
试了下src-gen这个文件夹必须手动创建,这里路径如果错了会抛出异常。
好了先别慌运行这段程序。新建一个Android项目名字是DaoExample,和刚才的JAVA项目保持在同一个文件夹下。
接着就可以运行刚才的JAVA程序,会看到src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,
1个DaoSession
- greenDAOGenerator
- Copyright2011-2013MarkusJunginger,greenrobot.de.LicensedunderGPLV3.
- ThisprogramcomeswithABSOLUTELYNOWARRANTY
- Processingschemaversion3...
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\NoteDao.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Note.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\CustomerDao.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Customer.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\OrderDao.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\Order.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoMaster.java
- WrittenD:\androidworkspace\OpenSource\greenDAO-master\DaoExample\src-gen\de\greenrobot\daoexample\DaoSession.java
- Processed3entitiesin7743ms
可以看到DaoMaster中封装了SQLiteDatabase和SQLiteOpenHelper
来看看如何使用GreenDao实现CRUD
如下代码实现插入一个Note对象:
- DevOpenHelperhelper=newDaoMaster.DevOpenHelper(this,"notes-db",null);
- db=helper.getWritableDatabase();
- daoMaster=newDaoMaster(db);
- daoSession=daoMaster.newSession();
- noteDao=daoSession.getNoteDao();
- Notenote=newNote(null,noteText,comment,newDate());
- noteDao.insert(note);
官方推荐将取得DaoMaster对象的方法放到Application层这样避免多次创建生成Session对象。
感觉这个框架和Web的Hibernate有异曲同工之妙。
这里列出自己实际开发中的代码方便记忆:
首先是在Application层实现得到DaoMaster和DaoSession的方法:
- publicclassBaseApplicationextendsApplication{
- privatestaticBaseApplicationmInstance;
- privatestaticDaoMasterdaoMaster;
- privatestaticDaoSessiondaoSession;
- @Override
- publicvoidonCreate(){
- super.onCreate();
- if(mInstance==null)
- mInstance=this;
- }
- /**
- *取得DaoMaster
- *
- *@paramcontext
- *@return
- */
- publicstaticDaoMastergetDaoMaster(Contextcontext){
- if(daoMaster==null){
- OpenHelperhelper=newDaoMaster.DevOpenHelper(context,Constants.DB_NAME,null);
- daoMaster=newDaoMaster(helper.getWritableDatabase());
- }
- returndaoMaster;
- }
- /**
- *取得DaoSession
- *
- *@paramcontext
- *@return
- */
- publicstaticDaoSessiongetDaoSession(Contextcontext){
- if(daoSession==null){
- if(daoMaster==null){
- daoMaster=getDaoMaster(context);
- }
- daoSession=daoMaster.newSession();
- }
- returndaoSession;
- }
- }
然后写一个Db工具类:
- publicclassDbService{
- privatestaticfinalStringTAG=DbService.class.getSimpleName();
- privatestaticDbServiceinstance;
- privatestaticContextappContext;
- privateDaoSessionmDaoSession;
- privateNoteDaonoteDao;
- privateDbService(){
- }
- publicstaticDbServicegetInstance(Contextcontext){
- if(instance==null){
- instance=newDbService();
- if(appContext==null){
- appContext=context.getApplicationContext();
- }
- instance.mDaoSession=BaseApplication.getDaoSession(context);
- instance.noteDao=instance.mDaoSession.getNoteDao();
- }
- returninstance;
- }
- publicNoteloadNote(longid){
- returnnoteDao.load(id);
- }
- publicList<Note>loadAllNote(){
- returnnoteDao.loadAll();
- }
- /**
- *querylistwithwhereclause
- *ex:begin_date_time>=?ANDend_date_time<=?
- *@paramwherewhereclause,include'where'word
- *@paramparamsqueryparameters
- *@return
- */
- publicList<Note>queryNote(Stringwhere,String...params){
- returnnoteDao.queryRaw(where,params);
- }
- /**
- *insertorupdatenote
- *@paramnote
- *@returninsertorupdatenoteid
- */
- publiclongsaveNote(Notenote){
- returnnoteDao.insertOrReplace(note);
- }
- /**
- *insertorupdatenoteListusetransaction
- *@paramlist
- */
- publicvoidsaveNoteLists(finalList<Note>list){
- if(list==null||list.isEmpty()){
- return;
- }
- noteDao.getSession().runInTx(newRunnable(){
- @Override
- publicvoidrun(){
- for(inti=0;i<list.size();i++){
- Notenote=list.get(i);
- noteDao.insertOrReplace(note);
- }
- }
- });
- }
- /**
- *deleteallnote
- */
- publicvoiddeleteAllNote(){
- noteDao.deleteAll();
- }
- /**
- *deletenotebyid
- *@paramid
- */
- publicvoiddeleteNote(longid){
- noteDao.deleteByKey(id);
- Log.i(TAG,"delete");
- }
- publicvoiddeleteNote(Notenote){
- noteDao.delete(note);
- }
- }
DB常量:
- publicclassConstants{
- publicstaticfinalStringDB_NAME="note_db";
- }
Note实体类:
- //THISCODEISGENERATEDBYgreenDAO,DONOTEDIT.Enable"keep"sectionsifyouwanttoedit.
- /**
- *Entitymappedtotablenote.
- */
- publicclassNote{
- privateLongid;
- /**Not-nullvalue.*/
- privateStringtitle;
- /**Not-nullvalue.*/
- privateStringcontent;
- privatejava.util.DatecreateDate;
- publicNote(){
- }
- publicNote(Longid){
- this.id=id;
- }
- publicNote(Longid,Stringtitle,Stringcontent,java.util.DatecreateDate){
- this.id=id;
- this.title=title;
- this.content=content;
- this.createDate=createDate;
- }
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- /**Not-nullvalue.*/
- publicStringgetTitle(){
- returntitle;
- }
- /**Not-nullvalue;ensurethisvalueisavailablebeforeitissavedtothedatabase.*/
- publicvoidsetTitle(Stringtitle){
- this.title=title;
- }
- /**Not-nullvalue.*/
- publicStringgetContent(){
- returncontent;
- }
- /**Not-nullvalue;ensurethisvalueisavailablebeforeitissavedtothedatabase.*/
- publicvoidsetContent(Stringcontent){
- this.content=content;
- }
- publicjava.util.DategetCreateDate(){
- returncreateDate;
- }
- publicvoidsetCreateDate(java.util.DatecreateDate){
- this.createDate=createDate;
- }
- }