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 ...
随机推荐
- .NET 中的DateTime
DateTime简介 DateTime是.NET中的时间类型,可以通过DateTime完成诸如获取当前的系统时间等操作.DateTime在.NET中是一个结构体,而并不是一个类. 如上图所示,这个图标 ...
- 如何给WordPress安装百度统计代码
1.注册并登录百度统计,点击页面顶部的“网站中心”,然后点击右上角“+ 新增网站”,填写网站域名确定后,点击“复制代码”:2.登录 WordPress 后台,点击左侧导航栏“外观”里的“编辑”,然后点 ...
- redmine添加自定义属性
使用redmine创建问题的时候,可能会发现没有我们需要的属性,这时候我们可以添加自定义的属性. 以添加满意度属性为例: 1.进入redmine管理界面,选择自定义属性 2.选择问题下面的新建自定义属 ...
- JQuery Validate使用总结
本文参考了 http://www.cnblogs.com/linjiqin/p/3431835.html 可以在mvc 或webform项目中使用,可以方便快捷的对前端表单进行校验 一.导入两个js ...
- Lucene全文检索框架
1.什么时Lucene? 是一个全文搜索框架,而不是应用产品,他只是一种工具让你能实现某些产品,并不像www.baidu.com拿来就能用 是apache组织的一个用java实现的全文搜索引擎的开源项 ...
- div左右布局
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html> <head> ...
- PHP二维数组根据某个键名排序
$result = array( array( "amount": "11.00", "date": ...
- php 实现多线程
通过php的Socket方式实现php程序的多线程.php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的.每一个访问者,当访问WEB页面的时候,都将 ...
- Remoting,OData Snippet Compiler等
http://www.sliver.com/dotnet/SnippetCompiler/ [ASP.NET Web API教程]ASP.NET Web API系列教程目录 张逸 .Net Remot ...
- MySQL线上执行大事务或锁表操作
前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...