原文出自:http://coenraets.org/blog/2007/10/annotating-actionscript-classes-with-custom-metadata-simple-orm-framework-for-air/
PS:英文很差,翻意得很不好,请见谅
flex3.0有一个比较少人知道的新功能,用自定义的元数据注解ActionScript类。你能用如下的例子一样注解你的类
package { [Bindable] [Table(name="contact")] public class Contact { [Id] [Column(name="contact_id")] public var contactId:int; [Column(name="first_name")] public var firstName:String; [Column(name="last_name")] public var lastName:String; public var address:String; public var city:String; public var state:String; public var zip:String; public var phone:String; public var email:String; } }
在这个例子中,[Bindable]是ActionScript标准的 metadata annotation,而Table, Id 和Column则是用户自定义的。编译器的-keep-as3-metadata参数允许你在编译后保留自定义的metadata annotation(PS:很莫名的实现方式,不知道以后会不会有变动),有相关的API操作它( describeType)
现在,我们来设置编译器的参数,在FlexBuilder中右键点击AIR的项目,选择菜单中的"Properties"项,然后再选择"Flex Compiler"项。在这个例子中,我们在"Additional compiler arguments"加入参数-keep-as3-metadata+=Table,Id,Column(PS:附件中有截图)。这样,我们就可以使用自定义的annotation了。
自定义的metadata annotation能用他来做各种各样有趣的事。为此,今年我用自定义的 metadata annotation为AIR写了一个简单的数据库持久化框架。
使用这个框架,你可以在实体类中像hiberante annotation一样,用metadata annotation标记实体对应的table的名称,及对应的ID和字段名。我们可以用这个框架,把实体对像中的数据持久化到Air内置的 SQLite database数据库中,而不用写SQL语句。如果没有数据库,或表框架自为你建库和表。
以下例子中将新增一contact到你的数据库中
var contact:Contact = new Contact(); contact.firstName = "Christophe"; contact.lastName = "Coenraets"; contact.email = "ccoenrae@adob.com"; entityManager.save(contact);
修改的例子如下
contact.firstName = “Chris”; entityManager.save(contact);
删除的例子如下
entityManager.remove(contact);
通过你的metadata annotation注释,框架可以entityManger实例会自动生成SQL语句,来进行数据库操作。
注意:这个是一个简单的框架的,他不是一个完备的ORM解决方案。为了简单化,他使用了一些假设,比如,所有的主键都被假设为自增变量的整型
你可以在附件中下载程序,在flexBuilder中建立一个air项目,引入这些文件,用上面的方法去设置编译器,就可以使用他了。
PS:我没有通测试通过这个例子,不过我看了他的代码,这是个可行的方案,为此我做过了这篇文章中最重要的Aonnotation的例子,证实这是可用的。