前提:最近写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中修改:

 package com.ShanFuBao.SmartCall.menu;

 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.
/**
* Entity mapped to table MENU_TABLE.
*/
public class MenuTable { private String menuName;
private Integer menuType;
private Long menuId;
private String menuCreateTime;
private Long storeId; public MenuTable() {
} public MenuTable(Long menuId) {
this.menuId = menuId;
} public MenuTable(String menuName, Integer menuType, Long menuId, String menuCreateTime, Long storeId) {
this.menuName = menuName;
this.menuType = menuType;
this.menuId = menuId;
this.menuCreateTime = menuCreateTime;
this.storeId = storeId;
} public String getMenuName() {
return menuName;
} public void setMenuName(String menuName) {
this.menuName = menuName;
} public Integer getMenuType() {
return menuType;
} public void setMenuType(Integer menuType) {
this.menuType = menuType;
} public Long getMenuId() {
return menuId;
} public void setMenuId(Long menuId) {
this.menuId = menuId;
} public String getMenuCreateTime() {
return menuCreateTime;
} public void setMenuCreateTime(String menuCreateTime) {
this.menuCreateTime = menuCreateTime;
} public Long getStoreId() {
return storeId;
} public void setStoreId(Long storeId) {
this.storeId = storeId;
} }

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

 package com.ShanFuBao.SmartCall.menu;

 import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement; import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.Property;
import de.greenrobot.dao.internal.DaoConfig; import com.ShanFuBao.SmartCall.menu.MenuTable; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* DAO for table MENU_TABLE.
*/
public class MenuTableDao extends AbstractDao<MenuTable, Long> { public static final String TABLENAME = "MENU_TABLE"; /**
* Properties of entity MenuTable.<br/>
* Can be used for QueryBuilder and for referencing column names.
*/
public static class Properties {
public final static Property MenuName = new Property(0, String.class, "menuName", false, "MENU_NAME");
public final static Property MenuType = new Property(1, Integer.class, "menuType", false, "MENU_TYPE");
public final static Property MenuId = new Property(2, Long.class, "menuId", true, "MENU_ID");
public final static Property MenuCreateTime = new Property(3, String.class, "menuCreateTime", false, "MENU_CREATE_TIME");
public final static Property StoreId = new Property(4, Long.class, "storeId", false, "STORE_ID");
}; public MenuTableDao(DaoConfig config) {
super(config);
} public MenuTableDao(DaoConfig config, DaoSession daoSession) {
super(config, daoSession);
} /** Creates the underlying database table. */
public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "'MENU_TABLE' (" + //
"'MENU_NAME' TEXT," + // 0: menuName
"'MENU_TYPE' INTEGER," + // 1: menuType
"'MENU_ID' INTEGER PRIMARY KEY AUTOINCREMENT ," + // 2: menuId
"'MENU_CREATE_TIME' TEXT," + // 3: menuCreateTime
"'STORE_ID' INTEGER);"); // 4: storeId
} /** Drops the underlying database table. */
public static void dropTable(SQLiteDatabase db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'MENU_TABLE'";
db.execSQL(sql);
} /** @inheritdoc */
@Override
protected void bindValues(SQLiteStatement stmt, MenuTable entity) {
stmt.clearBindings(); String menuName = entity.getMenuName();
if (menuName != null) {
stmt.bindString(1, menuName);
} Integer menuType = entity.getMenuType();
if (menuType != null) {
stmt.bindLong(2, menuType);
} Long menuId = entity.getMenuId();
if (menuId != null) {
stmt.bindLong(3, menuId);
} String menuCreateTime = entity.getMenuCreateTime();
if (menuCreateTime != null) {
stmt.bindString(4, menuCreateTime);
} Long storeId = entity.getStoreId();
if (storeId != null) {
stmt.bindLong(5, storeId);
}
} /** @inheritdoc */
@Override
public Long readKey(Cursor cursor, int offset) {
return cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2);
} /** @inheritdoc */
@Override
public MenuTable readEntity(Cursor cursor, int offset) {
MenuTable entity = new MenuTable( //
cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0), // menuName
cursor.isNull(offset + 1) ? null : cursor.getInt(offset + 1), // menuType
cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2), // menuId
cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // menuCreateTime
cursor.isNull(offset + 4) ? null : cursor.getLong(offset + 4) // storeId
);
return entity;
} /** @inheritdoc */
@Override
public void readEntity(Cursor cursor, MenuTable entity, int offset) {
entity.setMenuName(cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0));
entity.setMenuType(cursor.isNull(offset + 1) ? null : cursor.getInt(offset + 1));
entity.setMenuId(cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2));
entity.setMenuCreateTime(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
entity.setStoreId(cursor.isNull(offset + 4) ? null : cursor.getLong(offset + 4));
} /** @inheritdoc */
@Override
protected Long updateKeyAfterInsert(MenuTable entity, long rowId) {
entity.setMenuId(rowId);
return rowId;
} /** @inheritdoc */
@Override
public Long getKey(MenuTable entity) {
if(entity != null) {
return entity.getMenuId();
} else {
return null;
}
} /** @inheritdoc */
@Override
protected boolean isEntityUpdateable() {
return true;
} }

还有两个文件没有介绍,分别是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();

一些简单的使用方法如下

 //查看对应的menuTable表是否存在
QueryBuilder qb = menuDetailDao.queryBuilder();
qb.where(MenuDetailDao.Properties.MenuDateId.eq(CommonUtils.getNowDateString()+menu_type));
List listResult = qb.list(); QueryBuilder qbAll = menuDetailDao.queryBuilder();
qbAll.orderAsc(MenuDetailDao.Properties.MenuDateId);
List listResultAll = qbAll.list();
for(int k =0;k<listResultAll.size();k++)
{
MenuDetail menu_detail_entity = (MenuDetail) listResultAll.get(k);
CommonUtils.LogWuwei(tag, menu_detail_entity.getName()+" "+
menu_detail_entity.getMenuDateId());
}

3、自学的时候借阅了很多资料,如果恰巧你刚接触到,你会用到的:

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包括很多,绝对是你想象不到的)

1、android orm之greendao的更多相关文章

  1. Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点(一)

    引言 总所周知,SQLite--内嵌于Android中一个占用内存极小的关系型,作为我们Android存储领域中重要的一员 ,或多或少都曾接触到数据库.即使Android系统中提供了很多操作SQLit ...

  2. Android 自定义Android ORM 框架greenDAO数据库文件的路径

    import android.content.Context; import android.content.ContextWrapper; import android.database.Datab ...

  3. Android 数据库ORM框架GreenDao学习心得及使用总结<一>

    转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...

  4. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  5. 最好的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  6. 推荐的Android ORM框架

    1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...

  7. 数据库ORM框架GreenDao

    常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...

  8. 最受欢迎的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  9. Android ORM SQL Top 5

    If you are developing an Android application, you will likely need to store data somewhere. You may ...

随机推荐

  1. Target Operator ID has No Access to Upgrade

    If you are attempting to migrate a project between environments through application designer you mig ...

  2. Linux安装配置php环境的方法

    本文实例讲述了Linux安装配置php环境的方法.分享给大家供大家参考,具体如下: 1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.g ...

  3. sublime几个有用的快捷键

    几个有用的快捷键:Ctrl+D:选择多个相同字符串进行修改.选中字符串,按住Ctrl+D,继续选中下一个.Ctrl+Shift+L:将选中的内容切割成多行,然后每一行可以同时编辑Ctrl+J:将已选择 ...

  4. sublime简单配置

    Preferences------->settings user { "font_face": "Courier New", "font_siz ...

  5. 批量关闭 WordPress 的 Pingback 和 Trackback 功能

    方法很简单,WordPress 后台即可实现,在设置-讨论中把"接收来自外部博客的引用通告(Pingback 和 Trackback)"这一项勾选去掉,保存设置.这样,以后新增的文 ...

  6. sendBroadcast 无法接收

    项目中遇到已经sendbroadcast,但是在对应的BroadcastReceiver中却无法调用onReceiver 真是个纠结的问题.找了许久. 终于发现Intent中传递了一个参数(自定义类继 ...

  7. Windows Server 2003开机自动启动MySQL服务设置方法

    Windows Server 2003开机自动启动MySQL服务设置方法 发布时间:2014-12-19 更新时间:2014-12-24 来源:网络 作者:eaglezhong 关键词: 2003 e ...

  8. 从一个标准URL中提取文件的扩展名

    例如:http://www.sina.cn/abc/de.php?id=1  提出php 1. $url = 'http://www.sina.cn/abc/de.php?id=1'; $arr = ...

  9. 深入理解Java String#intern() 内存模型

    原文出处: codelog.me 大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 字符串 ...

  10. 通过Maven搭建Mybatis项目

    学习通过maven工程搭建Mybatis工程开启对M ybaits的学习总结之旅. 1.首先创建Maven工程. 2.在pom.xml文件中加入依赖的jar <!-- mybatis核心包 -- ...