前提:最近写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. C#处理Excel

    C#处理Excel C#处理Excel 前言 OleDb 具体操作 NPOI 具体操作 Excel C# NPOI OleDb 前言 最近需要对Excel进行加密解密操作,本身是一个简单的事情,通过 ...

  2. asp.net webuploader粘贴,拖拽,点击上传图片

    demo.html代码:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  3. jQuery实现动态添加和删除一个div

    本文主要给大家简单介绍一下如何动态的在一个元素添加和删除div,希望能够得到举一反三之效. 代码实例如下: <!DOCTYPE html> <html> <head> ...

  4. POJ C程序设计进阶 编程题#4:Tomorrow never knows?

    来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 甲壳虫的<A day ...

  5. ping通网关 ping不能外网  DNS无法解析

       ###ping通网关 ping不能外网  DNS无法解析 客户上不了网 DNS解析不了  首先登陆机器 先查看IP  然后看dns是否正常 然后测试ping网关  ping外网 nslookup ...

  6. winfrom之动态控件生成以及保存动态空间的数据

    前些天要完成一个winform程序,里面涉及到动态控件的添加以及保存动态空间中数据的保存,效果如下 初始化时: 点击添加阶梯价后:(点击一下,动态添加一行) 那么接下来,我们就具体的讲下代码实现: 首 ...

  7. set 赋值(转载)

    名著<C#设计模式>第9章“观察者模式”涉及了标准的事件处理流程,作者在探讨属性值变更时给出一个如下示例代码(P73-74): pulbic abstract class TpeakFun ...

  8. maraidb半同步复制

    半同步复制是在主从同步复制的基础之上,主从同步前面我的博文有介绍 Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库 MySQL在加载 ...

  9. centos下安装php环境

    centos下安装php环境 安装apache yum install httpd-devel 启动apache /etc/init.d/httpd start 安装mysql yum install ...

  10. 模拟新浪微博textarea,刷新页面输入信息保留

    今天我们的产品经理提出一个新需求,模拟新浪微博textarea框,输入内容刷新页面保留信息. 我是用的方法是Html5 LocalStorage存储的,开始计划用cookie.或mysql存储,尝试了 ...