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中修改:
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的更多相关文章
- Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点(一)
引言 总所周知,SQLite--内嵌于Android中一个占用内存极小的关系型,作为我们Android存储领域中重要的一员 ,或多或少都曾接触到数据库.即使Android系统中提供了很多操作SQLit ...
- Android 自定义Android ORM 框架greenDAO数据库文件的路径
import android.content.Context; import android.content.ContextWrapper; import android.database.Datab ...
- Android 数据库ORM框架GreenDao学习心得及使用总结<一>
转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...
- 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结
转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- 推荐的Android ORM框架
1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...
- 数据库ORM框架GreenDao
常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...
- 最受欢迎的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- Android ORM SQL Top 5
If you are developing an Android application, you will likely need to store data somewhere. You may ...
随机推荐
- Regarding the %EDIT table
%EDITTABLE is field in the work record DERIVED. This field is generally used a prompt table for vari ...
- 解决Access连接 accdb 不可识别的数据库格式异常
在Access07之前的数据库后缀名均为*.mdb 而连接字符串写成Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myFolder\*.mdb ;Pe ...
- LVS+keepalived实现负载均衡
背景: 随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要 的浪费?同时实现商业硬件一样的 ...
- 使用junit进行Spring测试
这几天在做SpringMVC的项目,现在总结一下在测试的时候碰到的一些问题. 以前做项目,是在较新的MyEclipse(2013)上面进行Maven开发,pom.xml 文件是直接复制的,做测试的时候 ...
- C++求平均数
题目内容:求若干个证书的平均数. 输入描述:输入数据含有不多于5组的数据,每组数据由一个整数n(n<=50)打头,表示后面跟着n个整数. 输出描述:对于每组数据,输出其平均数,精确到小数点后3位 ...
- ASP.NET MVC5学习笔记之Action参数模型绑定值提供体系
这一节我们关注模型绑定的值提供体系,先来介绍几个重要的接口 一. IValueProvider,接口定义如下: public interface IValueProvider { bool Conta ...
- 使用WIF实现单点登录Part III —— 正式实战
我们接下来的demo将包括以下的工程: SiteA —— 基于.net framework 4.5的MVC 4程序,使用WIF 4.5的SDK,第一个RP SiteB —— 基于.net framew ...
- a 标签 跳转4种类型
<a href='' target=''>中的target有4种参数: '_self' , '_parent' , '_top' 和 '_blank' 在没有使用框架 ...
- linux下的mount命令的用法详解
挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...
- sqlalchemy - day4
query 此文算是自己的一个总结,不敢说对sqlalchemy有多精通,只能算是入门的总结,免得后面忘记了这些个基本的东西.数据库的增,删,改,查,前面已经介绍了session的增,删,改,现在来介 ...