﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-不做浮躁的人-随笔分类-air</title><link>http://www.blogjava.net/bjwulin/category/46995.html</link><description>正在行走的人...</description><language>zh-cn</language><lastBuildDate>Thu, 27 Jun 2013 09:01:45 GMT</lastBuildDate><pubDate>Thu, 27 Jun 2013 09:01:45 GMT</pubDate><ttl>60</ttl><item><title>flex4.7+air3.8备忘</title><link>http://www.blogjava.net/bjwulin/archive/2013/06/26/400967.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Wed, 26 Jun 2013 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2013/06/26/400967.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/400967.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2013/06/26/400967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/400967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/400967.html</trackback:ping><description><![CDATA[1、使用flex4.7，好处比较多，支持ios调试什么的。从官网上下载，然后试用安装，然后破解，很多地方给出dll破解，我使用后总是有这样或者那样的问题，因此建议以下方式破解：<br /><div>(1)..\Adobe\AdobeFlashBuilder4.7(64Bit)\eclipse\plugins\com.adobe.flexbuilder.project_4.7.0.349722\META-INF下面的MANIFEST.MF<br />修改：Bundle-Version:0.0.0<br /><br />(2)..\Adobe\AdobeFlashBuilder4.7(64Bit)\eclipse\features\com.adobe.flexide.feature_4.7.0.349722下面的feature.xml<br />修改：&lt;plugin id="com.adobe.flexbuilder.project" download-size="0" install-size="0" version="0.0.0"/&gt;<br /><br />(3)..\Adobe\AdobeFlashBuilder4.7(64Bit)\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722<br />下面：复制config.xml并重命名为config_builder.xml</div><br />2、air3.8的beta版本发布了，正式版本应该不远了，开发可以开始进行了，提供的几个特性应该也是很多人渴望的，升级是很有必要的，现在升级和以前稍微有点不一样了，官方发布两个版本：AIR 3.8 SDK &amp; Compiler Beta和AIR 3.8 SDK for Flex Developers<br /><div>AIR 3.8 SDK &amp; Compiler Beta，主要用于as3项目的编译，下载解压到</div><div>Windows 7: C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722<br />Mac OS: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722</div>注意清空原来的Airsdk，再copy。<br /><div>AIR 3.8 SDK for Flex Developers，主要用于flex project的编译，解压覆盖到你所使用的flex sdk目录直接进行合并即可。<br /><br />3、flash player更新：<br /><div>下载playerglobal.swc文件：SWC文件：http://download.macromedia.com/get/flashplayer /updaters/11/playerglobal11_8.swc，并命名为playerglobal.swc<br />  进入Flex SDK目录（..\Adobe\Adobe Flash Builder  4.7\sdks\4.6\frameworks\libs\player），您应该看到里面已经有了一个11.1的文件夹，您要做的就是建立一个新的文 件夹，命名为11.8，并把刚才下载的playerglobal.swc放进去即可。<br /> <br />  再返回frameworks目录（..\Adobe\Adobe Flash Builder 4.7\sdks\4.6\frameworks），打开flex-config.xml，注意修改下面的两行：<br />  11.6<br />  19<br />  最后，再将新下载的FP debugger 复制到C:\Program Files\Adobe\Adobe Flash Builder 4.7\player\win\11.6文件夹下，并改名为FlashPlayerDebugger.exe OK<br /><br />4、要使用air3.8的新特性，也得把-swf-version=21加上，不然测试ServerSocket.isSupported肯定输出false</div></div><img src ="http://www.blogjava.net/bjwulin/aggbug/400967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2013-06-26 14:34 <a href="http://www.blogjava.net/bjwulin/archive/2013/06/26/400967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为FlexOrm实现基于Criteria的分页功能。</title><link>http://www.blogjava.net/bjwulin/archive/2010/12/13/340443.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Mon, 13 Dec 2010 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2010/12/13/340443.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/340443.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2010/12/13/340443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/340443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/340443.html</trackback:ping><description><![CDATA[延续<a href="http://www.blogjava.net/bjwulin/archive/2010/12/10/340262.html" target="_blank">上一篇博客</a>，本文主要讲讲如果为flexorm增加分页查询的功能，当然是基于Criteria，flexorm没有提供查询语言，criteria是目前的首选。<br />
<br />
1、我修改Criteria类，传入两个参数：<br />
<p>private var _firstResult:int=-1;<br />
&nbsp;&nbsp;private var _maxResult:int=-1;</p>
<p>&nbsp;&nbsp;public function setFirstResult(value:int):Criteria {<br />
&nbsp;&nbsp;&nbsp;_firstResult=value;<br />
&nbsp;&nbsp;&nbsp;return this;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public function setMaxResult(value:int):Criteria {<br />
&nbsp;&nbsp;&nbsp;_maxResult=value;<br />
&nbsp;&nbsp;&nbsp;return this;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public function get firstResult():int {<br />
&nbsp;&nbsp;&nbsp;return _firstResult;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public function get maxResult():int {<br />
&nbsp;&nbsp;&nbsp;return _maxResult;<br />
&nbsp;&nbsp;}</p>
值得注意的是，我的setXX方法，不同传统的setXX方法，返回Criteria自身，也是为了写代码方便。<br />
<br />
2、在SelectCommand方法增加两个参数定义：<br />
&nbsp;&nbsp;private var _firstResult:int=-1;<br />
&nbsp;&nbsp;private var _maxResult:int=-1;<br />
默认值为-1。<br />
<br />
3、在SelectCommand的setCriteria(crit:Criteria)方法后面增加以下代码，将Criteria的新增加的两个参数值传进来。<br />
_firstResult=crit.firstResult;<br />
&nbsp;&nbsp;&nbsp;_maxResult=crit.maxResult;<br />
<br />
4、在SelectCommand的prepareStatement()的_statement.text=sql;语句前增加以下代码：<br />
<p>if (_firstResult != -1 &amp;&amp; _maxResult != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;sql+=" limit " + _firstResult + "," + _maxResult;<br />
&nbsp;&nbsp;&nbsp;}<br />
</p>
<p>该代码利用sqlite的limit语法进行分页。<br />
<br />
5、以上基本的功能代码实现完毕，下面在EntityManager实现分页的接口代码：</p>
<p>public function findPage(page:Page, c:Criteria):Page {<br />
&nbsp;&nbsp;&nbsp;page=page.cleanDatas();<br />
&nbsp;&nbsp;&nbsp;if (page.countTotal) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var totalCount:int=fetchCriteriaCountResult(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;page.totalCount=totalCount;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;validPageInfo(page);<br />
&nbsp;&nbsp;&nbsp;if (page.totalCount == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return page;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;c.setFirstResult(page.startNo);<br />
&nbsp;&nbsp;&nbsp;c.setMaxResult(page.pageSize);</p>
<p>&nbsp;&nbsp;&nbsp;page.datas=fetchCriteria(c);<br />
&nbsp;&nbsp;&nbsp;return page;<br />
&nbsp;&nbsp;}</p>
<br />
private function validPageInfo(page:Page):void {<br />
&nbsp;&nbsp;&nbsp;if (page.pageNo == 0 || page.totalCount == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;page.pageNo=1;<br />
&nbsp;&nbsp;&nbsp;} else if (page.totalPageCnt &lt; page.pageNo) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;page.pageNo=page.totalPageCnt;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
6、其它：可以在Criteria上增加一个PropertyFilter的功能：<br />
public function addCriteriaFilter(propertyFilters:ArrayCollection):Criteria {<br />
&nbsp;&nbsp;&nbsp;for each (var pf:PropertyFilter in propertyFilters) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (StringUtils.isEmpty(pf.matchType) || pf.matchType == PropertyFilter.MATCHTYPE_EQ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addEqualsCondition(pf.matchField, pf.matchValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (pf.matchType == PropertyFilter.MATCHTYPE_LIKE) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addLikeCondition(pf.matchField, '%' + (pf.matchValue as String) + '%');<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (pf.matchType == PropertyFilter.MATCHTYPE_LIKESTART) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addLikeCondition(pf.matchField, (pf.matchValue as String) + '%');<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (pf.matchType == PropertyFilter.MATCHTYPE_LIKEEND) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addLikeCondition(pf.matchField, '%' + (pf.matchValue as String));<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (pf.matchType == PropertyFilter.MATCHTYPE_LT) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addLessThanCondition(pf.matchField, pf.matchValue as String);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (pf.matchType == PropertyFilter.MATCHTYPE_GT) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addGreaterThanCondition(pf.matchField, pf.matchValue as String);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Error("传入的过滤匹配类型参数不正确。");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return this;<br />
&nbsp;&nbsp;}<br />
7、测试代码：<br />
private function searchUsers(_page:Page, _propertyFilters:ArrayCollection=null):void {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var c:Criteria=entityManager.createCriteria(IaUser).addCriteriaFilter(_propertyFilters);<br />
&nbsp;&nbsp;&nbsp;&nbsp;page=entityManager.findPage(_page, c);<br />
&nbsp;&nbsp;&nbsp;}<br />
总结，采用limit实现分页后，大数据量达到10万后，性能差异将是数量级的提高。 
<img src ="http://www.blogjava.net/bjwulin/aggbug/340443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2010-12-13 09:52 <a href="http://www.blogjava.net/bjwulin/archive/2010/12/13/340443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为FlexOrm的Criteria增加count求值。</title><link>http://www.blogjava.net/bjwulin/archive/2010/12/10/340262.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Fri, 10 Dec 2010 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2010/12/10/340262.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/340262.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2010/12/10/340262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/340262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/340262.html</trackback:ping><description><![CDATA[在我<a href="http://www.blogjava.net/bjwulin/archive/2010/11/11/337820.html" target="_blank">前一篇blog</a>中，我大概介绍了下Flexorm的基本用法。现在由于要在一个项目中进行使用，下午花了些时间大概看看。<br />
<br />
flexorm尽管没有查询语言，但是它的Criteria做的基本上也能满足要求了，比如eq,like以及and,or的Restriction都做了。毕竟用在客户端的flexorm不会很复杂。但是flexorm没有做pagnation。没有充分利用sqlite的limit。如果我们的数据到了10万条，每次检索还是费时费力，有必要利用limit语法做分页。<br />
<br />
因此，我首先修改代码来计算count。<br />
<br />
1、我原计划继承SelectCommand来实现一个SelectCountCommand的类，结果发现hack代码太多，不如直接在SelectCommand上增加一个方法，因为count对比一般的select无非是select进行改变和去掉orderby。增加以下方法：<br />
<br />
public function excuteCount():void {<br />
&nbsp;&nbsp;&nbsp;if (_changed)<br />
&nbsp;&nbsp;&nbsp;&nbsp;prepareStatement();<br />
&nbsp;&nbsp;&nbsp;_statement.text=_statement.text.replace(/select.*?from/gi, "select count(*) as cnt from").replace(/order\s*by/gi, '');<br />
&nbsp;&nbsp;&nbsp;if (_debugLevel &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;debug();<br />
&nbsp;&nbsp;&nbsp;_statement.execute();<br />
&nbsp;&nbsp;&nbsp;if (_responder == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;_result=_statement.getResult().data;<br />
&nbsp;&nbsp;}<br />
<br />
2、修改SelectCommand类后，自然要修改EntityManager类，提供查询Count的方法。<br />
<br />
public function fetchCriteriaCountResult(crit:Criteria):int {<br />
&nbsp;&nbsp;&nbsp;var selectCommand:SelectCommand=crit.entity.selectCommand.clone();<br />
&nbsp;&nbsp;&nbsp;selectCommand.setCriteria(crit);<br />
&nbsp;&nbsp;&nbsp;selectCommand.excuteCount();<br />
&nbsp;&nbsp;&nbsp;var cnt:int=(selectCommand.result &amp;&amp; selectCommand.result.length &gt; 0) ? selectCommand.result[0].cnt : 0;<br />
&nbsp;&nbsp;&nbsp;clearCache();<br />
&nbsp;&nbsp;&nbsp;return cnt;<br />
&nbsp;&nbsp;}<br />
<br />
测试样例代码：<br />
var c:Criteria=entityManager.createCriteria(IaUser);<br />
&nbsp;&nbsp;&nbsp;&nbsp;c.addEqualsCondition("name", "张三");<br />
&nbsp;&nbsp;&nbsp;var cnt:int=entityManager.fetchCriteriaCountResult(c) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;users=entityManager.fetchCriteria(c)<br />
<br />
下一篇博客将实现Criteria方式的具体分页代码...
<img src ="http://www.blogjava.net/bjwulin/aggbug/340262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2010-12-10 14:56 <a href="http://www.blogjava.net/bjwulin/archive/2010/12/10/340262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Air的Orm--FlexOrm</title><link>http://www.blogjava.net/bjwulin/archive/2010/11/11/337820.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Thu, 11 Nov 2010 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2010/11/11/337820.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/337820.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2010/11/11/337820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/337820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/337820.html</trackback:ping><description><![CDATA[一个Orm应该至少提供以下四个主要特性：<br />
<br />
1、提供CRUD操作的API。<br />
<br />
2、提供一种查询语言，能够直接针对类和属性的查询，比如hibernate提供hql。<br />
<br />
3、提供注释元数据。<br />
<br />
4、提供事务执行脏数据检查，延迟加载以及其它的优化功能。<br />
<br />
在目前所有的Air orm（airdb,airorm,flexorm等）中，目前只有flexorm实现的比较全，基本上1，3，4都实现了，第二个嘛，我看新的版本也模仿hibernate做Criteria的标准化查询。<br />
<br />
<br />
注意在使用flexorm的项目中，除了将flexorm.swc加在项目的libs中，还要在编译属性的编译参数上加：-keep-as3-metadata+=Table,Id,Column,ManyToOne,OneToMany,ManyToMany,Transient<br />
<br />
metadata+=意味着该项目除了使用sdk的metadata外，还增加Table,Id...等元数据。<br />
<br />
<br />
这些元数据对于我们常用hb的人，应该很熟悉，不一一介绍了。<br />
<br />
<br />
使用flexOrm参考代码如下：<br />
<br />
1、在主应用的script:<br />
<br />
protected var entityManager:EntityManager = EntityManager.instance;<br />
<br />
protected function application_creationCompleteHandler( event:FlexEvent ):void<br />
{<br />
&nbsp;&nbsp; &nbsp;var dbFile:File = File.applicationStorageDirectory.resolvePath( "main.db" );<br />
&nbsp;&nbsp; &nbsp;var sqlConnection:SQLConnection = new SQLConnection();<br />
&nbsp;&nbsp; &nbsp;sqlConnection.open( dbFile );<br />
&nbsp;&nbsp; &nbsp;entityManager.sqlConnection = sqlConnection;<br />
}<br />
主要是创建EntityManager,这个类是个单例模式，需要赋值sqlConnection。<br />
protected function savePerson():void<br />
{<br />
&nbsp;&nbsp; &nbsp;var person:Person= new Person();<br />
&nbsp;&nbsp; &nbsp;person.firstName = firstNameInput.text;<br />
&nbsp;&nbsp; &nbsp;person.lastName = lastNameInput.text;<br />
&nbsp;&nbsp; &nbsp;entityManager.save(person);<br />
}<br />
<br />
package<br />
{<br />
&nbsp;&nbsp; &nbsp;[Bindable]<br />
&nbsp;&nbsp; &nbsp;[Table( name="Person" )]<br />
&nbsp;&nbsp; &nbsp;public class Person<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[Id]<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public var id:int; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[Column( name="first_name" )]<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public var firstName:String;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[Column( name="last_name" )]<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public var lastName:String;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
<img src ="http://www.blogjava.net/bjwulin/aggbug/337820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2010-11-11 16:51 <a href="http://www.blogjava.net/bjwulin/archive/2010/11/11/337820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>