《Andorid开源》greenDao 数据库orm框架
前言:以前没用框架写Andorid的Sqlite的时候就是用SQLiteDatabase ,SQLiteOpenHelper ,SQL语句等一些东西,特别在写SQL语句来进行
官方Demo里共有六个工程目录,分别为:
(1).DaoCore:库目录,即jar文件greendao-1.3.0-beta-1.jar的代码;
(2).DaoExample:android范例工程;
(3).DaoExampleGenerator:DaoExample工程的DAO类构造器,java工程;
(4).DaoGenerator:DAO类构造器,java工程;
(5).DaoTest、PerformanceTestOrmLite:其他测试相关的工程
- 最高性能(可能是最快的ORM为Andorid)
- 简单易用的APIs
- 高度优化Andorid
- 最小的内存占用
- 小的librry size,可以专注于实际问题
三
官方demo的介绍:
(一) DAO类构造(实体 + 数据库的一些初始化的操作代码)
首先要新建一个java工程( 这个工程就是以后用来生成数据库表和对应实体的工程了)来生成DAO类文件,这个工程需要导入greendao-generator-1.3.1和freemarker-2.3.22这两个jar包要下对,版本号不一定是要
我这个的。
01.package de.greenrobot.daogenerator.gentest;
02.import de.greenrobot.daogenerator.DaoGenerator;
03.import de.greenrobot.daogenerator.Entity;
04.import de.greenrobot.daogenerator.Property;
05.import de.greenrobot.daogenerator.Schema;
06.import de.greenrobot.daogenerator.ToMany;
07./**
08.* Generates entities and DAOs for the example project DaoExample.
09.*
10.* Run it as a Java application (not Android).
11.*
12.* @author Markus
13.*/
14.public class ExampleDaoGenerator
15.{
16.
17.public static void main(String[] args) throws Exception
18.{
19.Schema schema = new Schema(3, "de.greenrobot.daoexample");
20.
21.addNote(schema);
22.addCustomerOrder(schema);
23.
24.new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");
25.}
26.
27.private static void addNote(Schema schema)
28.{
29.Entity note = schema.addEntity("Note");
30.note.addIdProperty();
31.note.addStringProperty("text").notNull();
32.note.addStringProperty("comment");
33.note.addDateProperty("date");
34.}
35.
36.private static void addCustomerOrder(Schema schema)
37.{
38.Entity customer = schema.addEntity("Customer");
39.customer.addIdProperty();
40.customer.addStringProperty("name").notNull();
41.
42.Entity order = schema.addEntity("Order");
43.order.setTableName("ORDERS");
44.order.addIdProperty();
45.Property orderDate = order.addDateProperty("date").getProperty();
46.Property customerId = order.addLongProperty("customerId").notNull().getProperty();
47.order.addToOne(customer, customerId);
48.
49.ToMany customerToOrders = customer.addToMany(order, customerId);
50.customerToOrders.setName("orders");
51.customerToOrders.orderAsc(orderDate);
52.}
53.
54.}
对上面的代码做一些解释:
Schema schema =
new
Schema(
3
,
"de.greenrobot.daoexample"
); 3 ---- 自己写的数据库版本号 de.greenrobot.daoexample --- 包的所在地址 这些都可以不改的
addNote(schema) 方法执行后 就在 Android工程DaoExample中的src-gen文件中创建了一个Note实体,其中属性有text , comment , date 和NoteDao 其实就是对数据库的一些操作的
addCustomerOrder(schema)作用和addNote(schema)类似,只不过是多了表之间的关系(一对一 和 一对多)
方法(建表 ,查询等)和sql文都在这里面。
new DaoGenerator().generateAll(schema, "../DaoExample/src-gen"); 指定生成的路径
其中src-gen这个目录名需要在运行前手动创建,否则会报错。
运行后出现以下的提示说明DAO文件自动生成成功了,刷新一下DaoExample项目即可看到
运行后可以看到,DaoExample项目src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,1个DaoSession.
DaoExample
基于greenDao的android工程,他需要导入greendao-1.3.0-beta-1.jar
以后想在创建表和实体,就可以直接在这个工程里面添加方法就行了,以前的方法不能修改***
Note就是一个实体,代码就不贴出来了
看看NoteDao的代码:
public class NoteDao extends AbstractDao<Note, Long> { public static final String TABLENAME = "NOTE"; public static class Properties { public final static Property Id = new Property(0, Long.class, "id", true, "_id"); public final static Property Text = new Property(1, String.class, "text", false, "TEXT"); public final static Property Comment = new Property(2, String.class, "comment", false, "COMMENT"); public final static Property Date = new Property(3, java.util.Date.class, "date", false, "DATE"); }; public NoteDao(DaoConfig config) { super(config); } public NoteDao(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 + "'NOTE' (" + // "'_id' INTEGER PRIMARY KEY ," + // 0: id "'TEXT' TEXT NOT NULL ," + // 1: text "'COMMENT' TEXT," + // 2: comment "'DATE' INTEGER);"); // 3: date } /** Drops the underlying database table. */ public static void dropTable(SQLiteDatabase db, boolean ifExists) { String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "'NOTE'"; db.execSQL(sql); } /** @inheritdoc */ @Override protected void bindValues(SQLiteStatement stmt, Note entity) { stmt.clearBindings(); Long id = entity.getId(); if (id != null) { stmt.bindLong(1, id); } stmt.bindString(2, entity.getText()); String comment = entity.getComment(); if (comment != null) { stmt.bindString(3, comment); } java.util.Date date = entity.getDate(); if (date != null) { stmt.bindLong(4, date.getTime()); } } /** @inheritdoc */ @Override public Long readKey(Cursor cursor, int offset) { return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); } /** @inheritdoc */ @Override public Note readEntity(Cursor cursor, int offset) { Note entity = new Note( // cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id cursor.getString(offset + 1), // text cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // comment cursor.isNull(offset + 3) ? null : new java.util.Date(cursor.getLong(offset + 3)) // date ); return entity; } /** @inheritdoc */ @Override public void readEntity(Cursor cursor, Note entity, int offset) { entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); entity.setText(cursor.getString(offset + 1)); entity.setComment(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); entity.setDate(cursor.isNull(offset + 3) ? null : new java.util.Date(cursor.getLong(offset + 3))); } /** @inheritdoc */ @Override protected Long updateKeyAfterInsert(Note entity, long rowId) { entity.setId(rowId); return rowId; } /** @inheritdoc */ @Override public Long getKey(Note entity) { if(entity != null) { return entity.getId(); } else { return null; } } /** @inheritdoc */ @Override protected boolean isEntityUpdateable() { return true; } }
从代码中可以看到,就和以前直接操作sqlite是想类似的。
四
一些常用方法进行介绍( 摘至网络):
1.创建一个实体类
Entity note = schema.addEntity("Note");
默认表名就是类名,也可以自定义表名
dao.setTableName("NoteList");
greenDAO会自动根据实体类属性创建表字段,并赋予默认值。例如在数据库方面的表名和列名都来源于实体类名和属性名。默认的数据库名称是大写 使用下划线分隔单词,而不是在Java中使用的驼峰式大小写风格。例如,一个名为“CREATIONDATE”属性将成为一个数据库列 “CREATION_DATE”。
设置一个自增长ID列为主键:
dao.addIdProperty().primaryKey().autoincrement();
设置其他各种类型的属性:
dao.addIntProperty("cityId");
dao.addStringProperty("infoType").notNull();//非null字段
dao.addDoubleProperty("Id");
在生成的实体类中,int类型为自动转为long类型。
如果在编译过程中出现以下错误,那么有可能是主键的类型错误所致:
1.
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
在使用greenDAO时,一个实体类只能对应一个表,目前没法做到一个表对应多个实体类,或者多个表共用一种对象类型。后续的升级也不会针对这一点进行扩展。
(二)表的增删改查
增删改查相当方便,完全的面向对象,不需要涉及到任何的sql语言。
1.查询
范例1:查询某个表是否包含某个id:
public boolean isSaved(int ID)
{
QueryBuilder<SaveList> qb = saveListDao.queryBuilder();
qb.where(Properties.Id.eq(ID));
qb.buildCount().count();
return qb.buildCount().count() > 0 ? true : false;
}
范例2:获取整个表的数据集合,一句代码就搞定!
public List<PhotoGalleryDB> getPhotoGallery()
{
return photoGalleryDao.loadAll();// 获取图片相册
}
范例3:通过一个字段值查找对应的另一个字段值(为简便直接使用下面方法,也许有更简单的方法,尚未尝试)
01.
/** 通过图片id查找其目录id */
public int getTypeId(int picId)
{
QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();
qb.where(Properties.Id.eq(picId));
if (qb.list().size() > 0)
{
return qb.list().get(0).getTypeId();
}
else
{
return -1;
}
}
范例4:查找所有第一姓名是“Joe”并且以lastname排序。
List joes = userDao.queryBuilder()
where(Properties.FirstName.eq("Joe"))
orderAsc(Properties.LastName)
list();
范例5:多重条件查询
(1)获取id为cityId并且infotype为HBContant.CITYINFO_SL的数据集合:
public List<CityInfoDB> getSupportingList(int cityId)
{
QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
qb.where(qb.and(Properties.CityId.eq(cityId),Properties.InfoType.eq(HBContant.CITYINFO_SL)));
qb.orderAsc(Properties.Id);// 排序依据
return qb.list();
}
(2)获取firstname为“Joe”并且出生于1970年10月以后的所有user集合:
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("Joe"),
qb.or(Properties.YearOfBirth.gt(1970),
qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();
范例6:获取某列对象
picJsonDao.loadByRowId(picId);
2.增添/插入、修改
插入数据更加简单,也是只要一句代码便能搞定!
public void addToPhotoTable(Photo p)
{
photoDao.insert(p);
}
插入时需要new一个新的对象,范例如下:
DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
noteDao = daoSession.getNoteDao();
Note note = new Note(null, noteText, comment, new Date());
noteDao.insert(note);
修改更新:
1.
photoDao.insertOrReplace(photo);
2.
photoDao.insertInTx(photo);
这里可定有疑问的:例如update table SET age =20 WHERE name = "张三" 这样一个语句在greenDao中怎么执行的,
始终记住一句话,greenDao 对对象的增,删,改,查 就是对数据库的增,删,改,查
String updateName = content.getText().toString().trim();
QueryBuilder qb2 = studentDao.queryBuilder();
qb2.where(Properties.Name.eq("张三"));
List<Student> update = qb2.list();
String newName = content.getText().toString().trim();
for (Student student222 : update) {
student222.setAge(20);
studentDao.insertOrReplaceInTx(student222);
}
被查询出的对象被修改后,在替换原来自己的对象就可以了
3.删除:
(1)清空表格数据
/** 清空相册图片列表的数据 */
public void clearPhoto()
{
photoDao.deleteAll();
}
(2)删除某个对象
public void deleteCityInfo(int cityId)
{
QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();
DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();
bd.executeDeleteWithoutDetachingEntities();
}
参考:https://github.com/greenrobot/greenDAO/issues/34
http://my.oschina.net/cheneywangc/blog/196354
由上可见,使用greenDAO进行数据库的增删改查时及其方便,而且性能极佳。
《Andorid开源》greenDao 数据库orm框架的更多相关文章
- 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结
转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...
- LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读<赶快使用LitePal 2.0版本 ...
- ent facebook 开源的golang orm 框架
ent 是facebook 开源的golang orm 框架,简单强大,具有提下特性 schema 即代码 方便的图遍历 静态类型以及显示api 多种存储引擎支持(当前是mysql,sqlite,以及 ...
- [开源].NET数据库访问框架Chloe.ORM
扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...
- 数据库ORM框架GreenDao
常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...
- Android 数据库ORM框架GreenDao学习心得及使用总结<一>
转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...
- 数据库 ORM框架 ORMLite
几个ORM框架的比较 先介绍一下ORM的概念,以前也一直听说,不过没详细了解啥意思.其全称叫做对象关系映射(Object Relation Mapping),是一种程序设计技术,用于实现面向对象编程语 ...
- Django框架之数据库ORM框架
首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...
- Python元类实战,通过元类实现数据库ORM框架
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...
随机推荐
- java动态画圈圈。运用多线程,绘图
总结:只是意外的收获吧.之前一篇是老师教的,一个点,从底层开始升起,到鼠标按下的地方开始画圈圈, 现在改变了一下,因为点上升的一个循环和画圈的循环是分开的 现在让点点自己跑,并且边跑边画圈.而且在fo ...
- java冒泡排序算法例子
总结:运行显示数组下标越界说明,数组长度a.length.表示数组的长度,但索引值是要减一的.勿忘 package com.c2; //冒泡排序 //从小到大的顺序排列 public class MA ...
- Spring缓存源码剖析:(二)CacheManager
一.CacheManager总览 如果需要Spring缓存可以正常工作,必须配置一个CacheManager. CacheManager实现类你可以配置Spring-context本身提供的Simpl ...
- 学习笔记::fft
上次学fft还是5月份,昨天发现已经忘记怎么推导了,代码也看不懂了,就又学习了一发,大概是看menci的博客 0.fft可以进行多项式乘法,朴素的乘法跟手算一样是O(n^2),fft可以通过分治做到n ...
- git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题
$ git commit -a -m 'v6' *** Please tell me who you are. Run git config --global user.email "you ...
- Oracle11gR2_ADG管理之resinstate实战
主库上打开闪回 SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES 模拟断电 SQL> ...
- LibEvent代码阅读--多缓冲区和零拷贝技术
http://blog.chinaunix.net/uid-20937170-id-4827550.html
- .find()和.index()的区别
今天在复习基本数据类型——字符串的时候,有一点想法,总结一下: 字符串的定义:字符串是一个有序的字符集合,用于存储和表示基本的文字信息,用‘,“,‘’‘括起来的称之为字符串. 字符串的操作有很多种,比 ...
- Spring总结四:IOC和DI 注解方式
首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...
- 【bzoj1016】[JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4863 Solved: 1973[Submit][St ...