🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在了解greenDao之前,我们得了解什么是ORM,ORM Object-Relation-Mapping,对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上来说,它其实是创建了一个可在编程语言里使用的”虚拟对象数据库”。 面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系型数据库则是从数学理论发展而来的。两者之间是不匹配的,而ORM作为项目中间件形式实现数据在不同场景下数据关系映射,对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 那么,现在比较流行的有哪些ORM框架呢? - [OrmLite](http://ormlite.com/) - [greenDao](http://greendao-orm.com/) - [Activiteandroid](http://www.activeandroid.com/) - 其他的 我们今天在这里学习下greenDao的使用。关于greenDao和OrmLite的简单比较,请点击[传送门](http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1127/2066.html) greenDao设计的主要目标 - 一个精简的库 - 性能最大化 - 内存开销最小化 - 易于使用的API - 对Android进行高度优化 greenDao设计的主要特点 - greenDao性能远远高于同类的OrmLite, - greenDao支持[protocol buffer(protobuf)](https://github.com/google/protobuf) 协议数据的直接存储, - 与OrmLite等使用注解方式的ORM框架不同,greenDao使用Code generation 的方式,这也是其性能提升的原因 接下就看看如何用。 - 在gradle中添加依赖,并修改文件 ~~~ android { compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig { applicationId "gl.com.greendaodemo" minSdkVersion 17 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets{ main{ java.srcDirs = ['src/main/java','src/main/java-gen'] } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:23.0.1' compile 'de.greenrobot:greendao:2.0.0' } ~~~ 注意: ~~~ sourceSets{ main{ java.srcDirs = ['src/main/java','src/main/java-gen'] } } ~~~ 这个为新添加的,src/main/文件夹名 - 在与java同级的目录下新建一个文件夹,理论上名字随你 ![](https://box.kancloud.cn/2016-04-08_57076805d8916.jpg "") - 在项目中建一个Java Library ![](https://box.kancloud.cn/2016-04-08_57076805efaf9.jpg "") - 在java library的gradle脚本中添加 ~~~ compile 'de.greenrobot:greendao-generator:2.0.0' ~~~ - 在java library中编写代码 ~~~ public class ExampleDaoGenerator { public static void main(String[] args) throws Exception{ //自动生成的数据库版本号,和生成代码的包路径 Schema schema = new Schema(2,"gl.com.greendaodemo"); // 当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示: // Schema schema = new Schema(1, "me.itangqi.bean"); // schema.setDefaultJavaPackageDao("me.itangqi.dao"); // 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。 // schema2.enableActiveEntitiesByDefault(); // schema2.enableKeepSectionsByDefault(); // 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。 schema.enableKeepSectionsByDefault();//通过次Schema对象添加的所有实体都不会覆盖自定义的代码 addPerson(schema); // 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。 // 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。 new DaoGenerator().generateAll(schema, "/Users/mac/Desktop/GLandroidstudy/AS/greendaodemo/src/main/java-gen"); } public static void addPerson(Schema schema){ Entity person = schema.addEntity("Person"); //也可以重新给表命名 // person.setTableName("Person_1"); // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值 // 接下来你便可以设置表中的字段: // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。 // For example, a property called “creationDate” will become a database column “CREATION_DATE”. //id自增 name->非空字符串 age-> int 非空 person.addIdProperty(); person.addStringProperty("name").notNull(); person.addIntProperty("age").notNull(); person.addStringProperty("card"); } } ~~~ 小提示:右键文件,然后 copy path就可以将文件夹路径copy出来了。 代码中有详细的注释,就不在多说了。接下来我们回到我们的android工程中,看看我们的工程有什么变化。 ![](https://box.kancloud.cn/2016-04-08_570768061fb60.jpg "") 给我们生成了这些玩意。我们先暂时不管这些东西。 接下来我们就要实现增删改查了。想想是不是有点小激动呢。 - 获得操作数据的dao对象 ~~~ // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。 // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。 // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。 // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。 //实体名小写+s+"-db" DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"persons-db",null); db = helper.getWritableDatabase(); Log.e("tag","this is db version ->"+db.getVersion()); // 该数据库连接属于DaoMaster,所以多个Session指的是想用的数据库连接 daoMaster = new DaoMaster(db); daoSession =daoMaster.newSession(); return daoSession.getPersonDao(); ~~~ 具体就不解释了,代码里有注释。。 - CURL 增: ~~~ String name_string = name.getText().toString().trim(); int age_int = Integer.parseInt(age.getText().toString().trim()); Person person = new Person(null,name_string,age_int,age_int+""); Log.e("tag","name-->"+person.getName()+"---"+"age---->"+person.getAge()); dao.insert(person); NotifyDataSetChanged(); ~~~ 查and删 ~~~ String name_delate = name.getText().toString().trim(); Query<Person> query = dao.queryBuilder().where(PersonDao.Properties.Name.eq(name_delate)) .build(); List<Person> persons = query.list(); dao.delete(persons.get(0)); NotifyDataSetChanged(); ~~~ 看看NotifyDataSetChanged() ~~~ private void NotifyDataSetChanged() { String ageCoulmn =PersonDao.Properties.Age.columnName; String orderby = ageCoulmn + " COLLATE LOCALIZED ASC"; cursor = db.query(dao.getTablename(),dao.getAllColumns(), null,null,null,null,orderby); adapter.swapCursor(cursor); } ~~~ 恩,这次就说这么多把。 代码地址:[找到greendaoDemo和daoexamplegenerator]即可([https://github.com/Guolei1130/MySelfStudy](https://github.com/Guolei1130/MySelfStudy)) 如果大家还有疑问,请移步[泡在网上的日子](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1127/2069.html) 那么,最后,我们来放张效果图看看。 ![](https://box.kancloud.cn/2016-04-08_57076806371d1.jpg "") 这一篇只带来简单的用法,下一篇将带给大家更多的用法,如 - 表关联、以及一些复杂的查询 - 数据库升级 - 代码混淆