




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android关于greenDao的使⽤教程greenDao的使⽤第⼀篇Howtogetstarted?原⽂地址:greenDao⽰例⼯程。地址:,该⼯程包含两个⼦⼯程:DaoExample和DaoExampleGenerator。你可以clone到本地,运⾏或者直接在github上直接浏览。如果你从git仓储中检出了DaoExample,可以直接像Android应⽤⼀样运⾏它。正如你所看到的,它就是⼀个简单的笔记本。可以添加新的note,或者点击已存在的note进⾏删除。预⽣成代码和创建表在src-gen⽬录下,你可以找到⼀些已经⽣成的⽂件1)Note.javaNotejava类。2)NoteDao.javaNote对象的接⼝。DaoExampleGeneratorNote和NoteDao。DaoMasterSQLiteOpenHelper:newDaoMaster.DevOpenHelper(this,"notes-db",null)“CREATETABLESQL语句,greenDao会为你完成。插⼊和删除Note对象NotenoteNoteActivityonCreate对象:1 daoMaster=new2DaoMaster(db);3daoSession=daoMaster.newSession();noteDao=daoSession.getNoteDao();添加⼀个新的note到数据库中:1 Notenote=new2Note(null,3 noteText,comment,newDate());noteDao.insert(note);Log.d("DaoExample","Insertednewnote,ID:"+note.getId());javainsertIDNotelog中可以看到。noteonListItemClick⽅法中可以看到1 noteDao.deleteByKey(id);你也可以看⼀下其它的DAO⽅法:loadAll、update。数据模型化和代码的⽣成为了扩展note或者创建新的实体,你可以看⼀下DaoExampleGenerator⼯程。它包含了⼀个单例的类,该类中包含了数据模型的定义代码。1 Schemaschema=2Schema(1,"de.greenrobot.daoexample");3Entity4 note=schema.addEntity("Note");5note.addIdProperty();6note.addStringProperty("text").notNull();7note.addStringProperty("comment");note.addDateProperty("date");newDaoGenerator().generateAll("../DaoExample/src-gen",schema);正如你所看到的,你可以创建⼀个Schema对象,通过它你可以添加实体,⼀个实体连接了⼀张数据库表。⼀个实体包含⼀些属性,它们可以被映射到数据库的columns。⼀旦schema定义完成,你可以触发代码⽣成器,Note.java和NoteDao.java⽂件就是这样被创建的。下⼀步:对greenDao有了初步的了解,你可以⾃⼰动⼿试试了。当然,请查看下⽂档,如果没有找到你想要的,可以使⽤第⼆篇介绍GreenDao是⼀个⽤于Android开发的对象/关系映射(ORM)⼯具。它向SQLite数据库提供了⼀个对象导向的接⼝。像GreenDao这样的ORM⼯具不仅为你省去了很多的重复⼯作,⽽且提供了更简便的操作接⼝。代码⽣成的⼯程结构图AndroidGreenDao,你需要创建⼀个⼆级⼯程:“generatorproject”domain⽣成具体的代码。这个⽣成器⼯程就javagreenDao的greenDao-generator.jarfreemarker.jar在classpathjava类,构建你的实体模型并触发代码⽣成器,更多细节,可以参看⽂档。核⼼类⼀旦⽣成了指定的代码,就可以在你的android⼯程中使⽤greenDao了。别忘记在你的android⼯程中引⼊greenDao的核⼼jar包:greenDao.jar。以下是GreenDao的⼀些必要接⼝。DaoMaster:daomaster以⼀定的模式持有数据库对象)类(⽽不是对象)。有⼀个静态的⽅法创建和drop数据库表。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,⽤于创建SQLite数据库的模式。DaoSession:getDaoSession提供⼀些通⽤的持久化⽅法,⽐如对实体进⾏插⼊,加载,更新,刷DaoSessionidentityscopeDAOs(Dataaccessobjects):DaoSession它拥有更多持久化的⽅法,⽐如:加载全部,插⼊(insertInTx,语境不明了,暂且简单的翻译成插⼊)。实体可持久化的对象。通常,实体可以被⽣成,不⽤⼿动去写。在数据库的⾏中,使⽤的都是标准的java对象的属性(⽐如POJO或者JavaBean)。user.addIdProperty();user.addStringProperty("name");user.addStringProperty("password");user.addIntProperty("yearOfBirth");在⽰例中有⼀个Note实体,通过它的DAO,我们可以对指定的实体进⾏持久化的操作。第三篇实体的模型化greenDaogreenDaoDaojava代码。该模型本⾝是⽤java代码定义的,很简单:在DaoExampleGenerator⼯程的基础上创建⼀个java对象。具体你可以参看:下⾯的插图描绘了元模型,展⽰了⼀些⽤于描述domain具体模型的类。Schema实体数据schema是你定义的第⼀个对象,通过schema的版本和缺省的java包调⽤构造器。1 Schemaschema=Schema(1,"de.greenrobot.daoexample");这个缺省的java包会在greenDao⽣成实体、DAOs、和JUnit测试的时候使⽤。如果那些缺省值是正确的,那么就完成了第⼀步。如果你希望将DAO和测试类创建到不同的包中,可以重新定义schema的定义代码:schema.setDefaultJavaPackageTest("de.greenrobot.daoexample.test");schema.setDefaultJavaPackageDao("de.greenrobot.daoexample.dao");对于实体,该schema也有两个缺省的标记,它们是可以被复写的。这些标记可以区分实体是否是激活状态,是否应该使⽤sections。这些特性在⽂档⾥并没有,你可以看⼀下发布源码中的测试⼯程。schema2.enableKeepSectionsByDefault();schema2.enableActiveEntitiesByDefault();实体⼀旦你拥有了⼀个schema对象,你就可以使⽤它去添加实体了。1 Entityuser=schema.addEntity("User");⼀个实体有不同的可变更设置,更重要的是,你可以添加⼀些属性到实体。user.addIdProperty();user.addStringProperty("name");user.addStringProperty("password");user.addIntProperty("yearOfBirth");除了实体,还可以添加,。属性和主键addXXXPropertyPropertyBuilder对象,可以⽤于配制属性,columnNamecolumnnameProperyBuildergetProperty⽅法去访问属性对象,对于指数(indices)和关系的创建是有必要的。创建主键的约束现在实体必须拥有⼀个long或者Long类型的属性作为它们的主键,这是Android和SQLite推荐的实践⽅式。因为,在将来,greenDao要准备处理很多主键的脚本,但并不是每件事都能完全实现。为了解决这个问题,你可以使⽤⼀个long类型的键并且使⽤⼀个唯⼀的下标去处理这个预期的key属性。缺省java中的驼峰。“creationDate”“CREATION_DATE”,关系⼀对多和多对多的关系在中有注释。继承、接⼝、序列化setSuperclass(String)⽅法指定,注意:它可能会有其它的实体作为⽗类(但这⾥没有多态查询)。⽐如:1 myEntity.setSuperclass("MyCommonBehavior");通常,使⽤接⼝作为实体属性和⾏为的通⽤基类是⽐较好的。⽐如:⼀个实体A和B共享了⼀套属性,这些属性可以定义在C中。下⾯是⼀个序列化B的列⼦:"C");"C");entityB.implementsSerializable();触发⽣成器⼀旦你的实体schema放置好了,你可以触发代码⽣成器进⾏处理。在generator⼯程中,你可以实例化DaGenerator并调⽤generateAll中的⼀个⽅法:1 DaoGeneratordaoGenerator=new2DaoGenerator();daoGenerator.generateAll(schema,"../MyProject/src-gen");你所需要的就是schema对象和⽬标⽂件夹,通常该⽂件夹就是你android⼯程的资源⽂件夹。如果你想把这些测试类放到其他⽬录下,可以把⽬的⽂件夹作为第三个参数传⼊。保持独⽴性(Keepsections保持⾃定义的代码不会被覆盖)greenDao“keep”schema中使⽤enableKeepSectinsByDefault(),或者setHasKeepSections(true)在选中的实体中。⼀旦使⽤,3个独⽴的部分会在实体中⽣成:1 //KEEPINCLUDES-putyourcustomincludeshere2//3 KEEPINCLUDESEND4 ...5 //6 KEEPFIELDS-putyourcustomfieldshere7 //KEEPFIELDSEND8...//KEEPMETHODS-putyourcustommethodshere//KEEPMETHODSENDKEEPandKEEPEND.注释。在该范围的代码会在代码重新⽣成的时候不被覆盖。对于备份或者提交代码时出现的意外错误,这是⼀个不错的选择解决⽅案。第四篇⾮技术类的常见问题通常的疑问greenDaocodegeneration,⽽不是注解?greenDaoAndroid平台上,基于注解的解决⽅式是有缺陷的:它们不得不依赖于元数据的解析和反射。特别是反射,会ORMAndroidgreenDao如ft快的主要原因。另⼀个优势是⼤⼩。greenDaolib是⾮常⼩的(100K以下,包括单元测试)ORMgenerator中,⽽不是在核⼼库中。greenDao包含了:DaoCore,DaoGenerator和DaoTest。DaoCoreandroidApacheLicense2版本以下是许可的。DaoGenerator是javaDaoTestgreenDao本⾝和其稳定性。DaoGenerator和DaoTest在GPLV3以下是可⽤的。这些许可条款可以满⾜⼤部分的开发者使⽤。第五篇查询查询会返回符合某些特定标准的实体。你可以使⽤原始的SQL定制查询语句,或者更好的⽅式:使⽤GreenDao的QueryBuilderAPI。该查询也⽀持lazy-loading的结果集。这样在操作⼤量结果集的时候可以节省内存和性能。QueryBuilderSQLSQLSQL语句的时间。当然,由于语法的检验是在编译时才执⾏,所以在查询语句中发现bug是很困难的。QueryBuildergreenDaobug。“Joe”为firstnamelastname排序:1 Listjoes=userDao.queryBuilder()2.where(Properties.FirstName.eq("Joe"))3.orderAsc(Properties.LastName)4.list();获取⽤户名字为“Joe”并且在1970年9⽉之后出⽣的⽤户这⾥要说明下:user的birthday对于year,month,和day是⼀个分离的属性。我们可以以⼀种更正常的⽅式表达这种条件:Firstnameis“Joe”AND(yearofbirthisgreaterthan1970OR(yearofbirthis1970ANDmonthofbirthisequaltoorgreaterthan10(October).1 QueryBuilderqb=userDao.queryBuilder();2qb.where(Properties.FirstName.eq("Joe"),3qb.or(Properties.YearOfBirth.gt(1970),4qb.and(Properties.YearOfBirth.eq(1970),5 Properties.MonthOfBirth.ge(10))));ListyoungJoes=qb.list();Query和LazyListQueryQueryBuilderQuery类。build()在QueryBuilderQuery,⽽不是执⾏它。greenDao⽀持唯⼀的结果和结果列表。如果你想得到⼀个唯⼀的结果,可以调⽤Query或者QueryBuilder的unique()⽅法,这样在没有匹配条件的时候会返回⼀个唯⼀的结果,⽽不是null。如果你希望禁⽌⽤例中返回null,可以调⽤uniqueOrThrow(),该⽅法会保证返回⼀个⾮null的实体。否则就会抛出⼀个DaoException。如果你期望⼀次性返回多个实体,可以使⽤以下⽅法:list():所有的实体被加载到内存中。该结果通常是⼀个没有magicinvolved的ArrayList。使⽤起来最简单。listLazy():实体按照需求加载进⼊内存。⼀旦列表中的⼀个元素被第⼀次访问,它将被加载同时缓存以便以后使⽤。必须close。ListLasyUncached():⼀个“虚拟”的实体列表:任何对列表元素的访问都会导致从数据库中加载,必须close。listIterator():遍历通过需要的时候加载(lazily)获得的结果,数据没有缓存,必须close。listLazylistLazyUncachedlistIteratorgreenDao的LazyListcursor的引⽤。lazylist和iterators(try/finally代码块中)。lsitLazy()的cachelazylistlistIterator(lazyiteratorcursor。listclose()⼿动关闭。多次执⾏查询QueryBuilderqueryqueryquery对象要⾼效。如果query的参数没有变更,你只需要再次调⽤list/unique⽅法即可。如果有参数变更,你就需要调⽤setParameter⽅法处理每⼀个变更的参数。现在,个别参数由基于零的参数索引寻址。该下标基于你传递到querybuilder的参数。使⽤query对象获取出⽣在1970年并且firstname为joe的⽤户:1 Queryquery=userDao.queryBuilder().where(2Properties.FirstName.eq("Joe"),Properties.YearOfBirth.eq(1970)).build();ListjoesOf1970=query.list();使⽤query对象,可以查询1 "Maria");2query.setParameter(1,3 1977);ListmariasOf1977=query.list();在多个线程中执⾏查询queryforCurrentThread(querygreenDAO1.3开始,queryqueryquery对象设置参数时的安全性,避免其他线程的⼲扰。如果其他线程query对象上设置参数或者执⾏查询绑定到了其它线程,将会抛出异常。这样⼀来,你就不需要⼀个同步语句了。事实上你应该避免使⽤lock,因为如果在并发的事务中使⽤了同⼀个query对象,可能会导致死锁。1.3forCurrentThreadquerythread—local实例,该实例在当前的线程中使⽤是安全的。当每⼀次调⽤forCueerntThread()builderquery的时候,设置到初始化参数上。原始的查询这⾥有两种⽅式执⾏原始的SQL去获取实体。较好的⼀种⽅式是使⽤QueryBuilder和WhereCondition.StringCondition。使⽤这个⽅法,你可以为querybuilder的WHERE⼦句传递任何SQL⽚段。下⾯是⼀个笨拙的例⼦展⽰如果使⽤这种⽅式进⾏⼀个替代联合查询的⼦查询。1 Queryquery=userDao.queryBuilder().where(2new3StringCondi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 预防春季流感2
- 2025年保定理工学院单招职业技能考试题库汇编
- 信息化物流师行业标准试题及答案
- 2025年常德职业技术学院单招职业适应性测试题库及参考答案
- 音乐欣赏篇说课
- 电子商务教学评估试题及答案
- CPMM高频考点解析与试题及答案
- CPSM学习资料综合试题及答案
- 旅游客运企业社会责任履行与评价考核试卷
- 2024年CPMM重要试题及答案探讨
- 2024-2030年全球及中国石榴花提取物行业发展动态及供需前景预测报告
- 幼儿园体育游戏对幼儿社交能力的影响
- 《STP营销战略概述》课件
- 英语语法点点通(新疆交通职业技术学院)知到智慧树答案
- 2024年四川省绵阳市中考语文试卷(附真题答案)
- 女性的中医养生保健
- 【论正当防卫的限度(论文)8400字】
- 《跨境直播运营》课件-跨境直播的内容组织
- 参加社会保险人员登记表
- (正式版)SH∕T 3541-2024 石油化工泵组施工及验收规范
- DB22-T5131-2022预拌盾构砂浆应用技术标准
评论
0/150
提交评论