首页 > 系统 > Android > 正文

1、android orm之greendao

2019-11-14 21:54:31
字体:
来源:转载
供稿:网友
1、android orm之greendao前提:最近写android项目,android自带数据库api有点复杂,于是偷懒用了greendao。greendao好处自己查,这里不赘述,但是零基础的的我用起来还是费了3天的功夫,取之于网络,特在此奉献与网络。1、通过daoGenerator生成所需要的关键文件

步骤1、新建的java工程,起名daoGenerator

步骤2:导入两个jar包,分别是freemarker-2.3.20.jar和greendao-generator-1.3.1.jar,下载路径:http://search.maven.org,你可以在这里搜索上述两个包,自己导入到java工程中,

导入的时候记着不要有中文路径

步骤3:新建daoGenerator.java文件,文件格式如下

import de.greenrobot.daogenerator.DaoGenerator;import de.greenrobot.daogenerator.Entity;import de.greenrobot.daogenerator.PRoperty;import de.greenrobot.daogenerator.Schema;import de.greenrobot.daogenerator.ToMany;public class daoGenerator {    public static void main(String[] args) throws Exception {        Schema schema = new Schema(1,"com.example.menu");                addMenuDetail(schema);        addMenuTable(schema);        new DaoGenerator().generateAll(schema, "./");    }        private static void addMenuTable(Schema schema)    {        Entity menuTable = schema.addEntity("MenuTable");        menuTable.addStringProperty("menuName");//菜单的名称(周一早餐通用版)        menuTable.addIntProperty("menuType");//0早餐 1午餐 2晚餐        menuTable.addLongProperty("menuId").primaryKey().autoincrement();//菜单id        menuTable.addStringProperty("menuCreateTime");//菜单创建时间        menuTable.addLongProperty("storeId");//店铺的编号            }            private static void addMenuDetail(Schema schema) {        Entity menuDetail = schema.addEntity("MenuDetail");        menuDetail.addStringProperty("menuDateId");        menuDetail.addLongProperty("menuId");//菜单id        menuDetail.addIntProperty("widgetId");//控件id        menuDetail.addStringProperty("type");//控件类型:textview、pic、line、verticalLine、theme、tips        menuDetail.addStringProperty("name");//控件内容 "疙瘩汤"        menuDetail.addDoubleProperty("x");//x        menuDetail.addDoubleProperty("y");//y    }        }

该工程运行完毕会在当前目录下产生一个文件夹com,进入example再进入到menu(为什么会产生这样一个文件夹,这是由我们在程序中Schema schema = new Schema(1,"com.example.menu"), new DaoGenerator().generateAll(schema, "./");这两行决定的,如果你运行出错,请查看你是不是路径写错),可以发现生成如下几个文件:

简要说明:menuDetail和menuTable就是我们在daoGenerator中指定生成的表,在生成的文件中每张表分别对应两个文件,举例:表menuTable对应的两个文件一个是menuTable,一个是menuTableDao。

menuTable.java文件主要是menuTable中取得和设置列中元素的方法,见下图,注意:这是自动生成的代码,如果要修改列中元素名称可以在daoGenerator中修改:

 1 package com.ShanFuBao.SmartCall.menu; 2  3 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.  4 /** 5  * Entity mapped to table MENU_TABLE. 6  */ 7 public class MenuTable { 8  9     private String menuName;10     private Integer menuType;11     private Long menuId;12     private String menuCreateTime;13     private Long storeId;14 15     public MenuTable() {16     }17 18     public MenuTable(Long menuId) {19         this.menuId = menuId;20     }21 22     public MenuTable(String menuName, Integer menuType, Long menuId, String menuCreateTime, Long storeId) {23         this.menuName = menuName;24         this.menuType = menuType;25         this.menuId = menuId;26         this.menuCreateTime = menuCreateTime;27         this.storeId = storeId;28     }29 30     public String getMenuName() {31         return menuName;32     }33 34     public void setMenuName(String menuName) {35         this.menuName = menuName;36     }37 38     public Integer getMenuType() {39         return menuType;40     }41 42     public void setMenuType(Integer menuType) {43         this.menuType = menuType;44     }45 46     public Long getMenuId() {47         return menuId;48     }49 50     public void setMenuId(Long menuId) {51         this.menuId = menuId;52     }53 54     public String getMenuCreateTime() {55         return menuCreateTime;56     }57 58     public void setMenuCreateTime(String menuCreateTime) {59         this.menuCreateTime = menuCreateTime;60     }61 62     public Long getStoreId() {63         return storeId;64     }65 66     public void setStoreId(Long storeId) {67         this.storeId = storeId;68     }69 70 }
View Code

menuTableDao.java文件就是执行的对表进行增删改查的封装。

  1 package com.ShanFuBao.SmartCall.menu;  2   3 import android.database.Cursor;  4 import android.database.sqlite.SQLiteDatabase;  5 import android.database.sqlite.SQLiteStatement;  6   7 import de.greenrobot.dao.AbstractDao;  8 import de.greenrobot.dao.Property;  9 import de.greenrobot.dao.internal.DaoConfig; 10  11 import com.ShanFuBao.SmartCall.menu.MenuTable; 12  13 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 14 /**  15  * DAO for table MENU_TABLE. 16 */ 17 public class MenuTableDao extends AbstractDao<MenuTable, Long> { 18  19     public static final String TABLENAME = "MENU_TABLE"; 20  21     /** 22      * Properties of entity MenuTable.<br/> 23      * Can be used for QueryBuilder and for referencing column names. 24     */ 25     public static class Properties { 26         public final static Property MenuName = new Property(0, String.class, "menuName", false, "MENU_NAME"); 27         public final static Property MenuType = new Property(1, Integer.class, "menuType", false, "MENU_TYPE"); 28         public final static Property MenuId = new Property(2, Long.class, "menuId", true, "MENU_ID"); 29         public final static Property MenuCreateTime = new Property(3, String.class, "menuCreateTime", false, "MENU_CREATE_TIME"); 30         public final static Property StoreId = new Property(4, Long.class, "storeId", false, "STORE_ID"); 31     }; 32  33  34     public MenuTableDao(DaoConfig config) { 35         super(config); 36     } 37      38     public MenuTableDao(DaoConfig config, Daosession daoSession) { 39         super(config, daoSession); 40     } 41  42     /** Creates the underlying database table. */ 43     public static void createTable(SQLiteDatabase db, boolean ifNotExists) { 44         String constraint = ifNotExists? "IF NOT EXISTS ": ""; 45         db.execSQL("CREATE TABLE " + constraint + "'MENU_TABLE' (" + // 46                 "'MENU_NAME' TEXT," + // 0: menuName 47                 "'MENU_TYPE' INTEGER," + // 1: menuType 48                 "'MENU_ID' INTEGER PRIMARY KEY AUTOINCREMENT ," + // 2: menuId 49                 "'MENU_CREATE_TIME' TEXT," + // 3: menuCreateTime 50                 "'STORE_ID' INTEGER);"); // 4: storeId 51     } 52  53     /** Drops the underlying database table. */ 54     public static void dropTable(SQLiteDatabase db, boolean ifExists) { 55         String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'MENU_TABLE'"; 56         db.execSQL(sql); 57     } 58  59     /** @inheritdoc */ 60     @Override 61     protected void bindValues(SQLiteStatement stmt, MenuTable entity) { 62         stmt.clearBindings(); 63   64         String menuName = entity.getMenuName(); 65         if (menuName != null) { 66             stmt.bindString(1, menuName); 67         } 68   69         Integer menuType = entity.getMenuType(); 70         if (menuType != null) { 71             stmt.bindLong(2, menuType); 72         } 73   74         Long menuId = entity.getMenuId(); 75         if (menuId != null) { 76             stmt.bindLong(3, menuId); 77         } 78   79         String menuCreateTime = entity.getMenuCreateTime(); 80         if (menuCreateTime != null) { 81             stmt.bindString(4, menuCreateTime); 82         } 83   84         Long storeId = entity.getStoreId(); 85         if (storeId != null) { 86             stmt.bindLong(5, storeId); 87         } 88     } 89  90     /** @inheritdoc */ 91     @Override 92     public Long readKey(Cursor cursor, int offset) { 93         return cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2); 94     }     95  96     /** @inheritdoc */ 97     @Override 98     public MenuTable readEntity(Cursor cursor, int offset) { 99         MenuTable entity = new MenuTable( //100             cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0), // menuName101             cursor.isNull(offset + 1) ? null : cursor.getInt(offset + 1), // menuType102             cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2), // menuId103             cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // menuCreateTime104             cursor.isNull(offset + 4) ? null : cursor.getLong(offset + 4) // storeId105         );106         return entity;107     }108      109     /** @inheritdoc */110     @Override111     public void readEntity(Cursor cursor, MenuTable entity, int offset) {112         entity.setMenuName(cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0));113         entity.setMenuType(cursor.isNull(offset + 1) ? null : cursor.getInt(offset + 1));114         entity.setMenuId(cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2));115         entity.setMenuCreateTime(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));116         entity.setStoreId(cursor.isNull(offset + 4) ? null : cursor.getLong(offset + 4));117      }118     119     /** @inheritdoc */120     @Override121     protected Long updateKeyAfterInsert(MenuTable entity, long rowId) {122         entity.setMenuId(rowId);123         return rowId;124     }125     126     /** @inheritdoc */127     @Override128     public Long getKey(MenuTable entity) {129         if(entity != null) {130             return entity.getMenuId();131         } else {132             return null;133         }134     }135 136     /** @inheritdoc */137     @Override    138     protected boolean isEntityUpdateable() {139         return true;140     }141     142 }
View Code

还有两个文件没有介绍,分别是DaoMaster.java和DaoSessi.java文件,这两个文件很重要,也是daoGenerator工程自动生成的,

daoMaster文件是干嘛的,看下图:

明白了吗?他知道你创建的所有的dao对象,对,通过他,你可以得到你想要操作的表格对应的对象。

daoSession文件又是干嘛的??通过session你可以得到和删除dao对象。

到这里应该明白了:

我们以往通过sql去创建的表格,在这里通过daoGennerator的java工程来完成

②我们通过sql对表格的操作,可以通过daoMaser得到表格,然后通过daoSession获取到具体的对象,这样就完成了数据库到对象的映射,对应了orm的主题。

2、避开sql使用dao来执行表操作

OpenHelper helper = new DaoMaster.DevOpenHelper(context,"test_db", null);

daoMaster = new DaoMaster(helper.getWritableDatabase());

daoSession = daoMaster.newSession();

menuTableDao = daoSession.getMenuTableDao();

menuDetailDao = daoSession.getMenuDetailDao();

一些简单的使用方法如下

 1 //查看对应的menuTable表是否存在 2             QueryBuilder qb = menuDetailDao.queryBuilder(); 3             qb.where(MenuDetailDao.Properties.MenuDateId.eq(CommonUtils.getNowDateString()+menu_type)); 4             List listResult = qb.list(); 5              6             QueryBuilder qbAll = menuDetailDao.queryBuilder(); 7             qbAll.orderAsc(MenuDetailDao.Properties.MenuDateId); 8             List listResultAll = qbAll.list(); 9             for(int k =0;k<listResultAll.size();k++)10             {11                 MenuDetail menu_detail_entity = (MenuDetail) listResultAll.get(k);12                 CommonUtils.LogWuwei(tag, menu_detail_entity.getName()+"   "+13                         menu_detail_entity.getMenuDateId());14             }15             
View Code3、自学的时候借阅了很多资料,如果恰巧你刚接触到,你会用到的:

1、http://my.oschina.net/cheneywangc/blog/196354 greendao讲义,开源中国上的好文章

2、http://www.sllbeta.com/android/3/

3、http://greendao-orm.com/ 这个是官网,最权威的网站了

4、我是从哪里听说到这个greendao的呢,这得益于github上一个开源工程,在这个开源工程中,汇聚了android开发过程中开发者都有可能用到的,见下网址:

https://github.com/Trinea/android-open-project

5、http://blog.csdn.net/lan120576664/article/details/36204833(适合新手看看)

4、赠送所有开发者一句话,多看官网文档,如果需要看官网api,推荐一个工具,就是mac下的dash,dash支持代码片段和官网api(api包括很多,绝对是你想象不到的)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表