ColdFusion 9.0 Resources |
Client-side (AIR application) codeCreate a folder called “onetoone” in your AIR project and add the ActionScript class files: Customer.as and Address.as with code that could be something like the following: Customer.aspackage onetoone { [Bindable] [RemoteClass(alias="AIRIntegration.custome r")] [Entity] public class Customer { [Id] public var cid:int; public var name: String; [OneToOne(cascadeType='ALL',fetchType="EAGER")] [JoinColumn(name="add_id",referencedColumnName="aid")] public var address:Address; } } Address.aspackage onetoone { [Bindable] [RemoteClass(alias="AIRIntegration.address")] [Entity] public class Address { [Id] public var aid:int; public var street:String; } } MainApplication.mxmlAdd code like the following in the MainApplication.mxml file to perform CRUD operations on the database. Note: For Customer.as and Address.as ActionScript
classes, global variables have been declared.
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplic ation xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.rpc.AsyncToken; import mx.controls.Alert; import coldfusion.air.events.*; import coldfusion.air.*; import onetoone.Address; import onetoone.Customer; private var session:Session; private var dbFile:File; private var cusColl:ArrayCollection; private var syncmanager:SyncManager; private var add:Address;//global variable for address.as private var cus:Customer; //global variable for customer.as private function init():void { // Provide Credentials for Server side Connection and CFC syncmanager = new SyncManager(); syncmanager.cfPort = 80; syncmanager.cfServer = "localhost"; // Path of the Server side CFC from CF webroot syncmanager.syncCFC = "AIRIntegration.cusManager"; // This handler is called when any conflict occurs while writing back changes on the server side syncmanager.addEventListener(ConflictEvent.CONFLICT, conflictHandler); // Fetch Server side DB data onto Client SQLite DB while starting the App var token:AsyncToken= syncmanager.fetch("fetch"); token.addResponder(new mx.rpc.Responder(fetchSuccess, fetchFault)); } private function conflictHandler(event:ConflictEvent):void { Alert.show("conflict man!"); var conflicts:ArrayCollection = event.result as ArrayCollection; // Accept Server data and write it to client side SQLite DB var token:SessionToken = session.keepAllServerObjects(conflicts); token.addResponder(new mx.rpc.Responder(conflictSuccess, conflictFault)); } private function conflictSuccess(event:SessionResultEvent):void { Alert.show("conflict resolved"); } private function fetchSuccess(event:SyncResultEvent):void { var cus:Array = event.result as Array; cusColl = new ArrayCollection(cus); // Open a Session for the client side SQLite DB dbFile = File.userDirectory.resolvePath("onetoonesync.db"); var sessiontoken:SessionToken =syncmanager.openSession(dbFile,017915); sessiontoken.addResponder(new mx.rpc.Responder(connectSuccess,connectFault)); } private function connectSuccess(event:SessionResultEvent):void { session = event.sessionToken.session; if(cusColl.length > 0) { // This operation saves it to the AIR SQLite DB var savetoken:SessionToken = session.saveCache(cusColl); savetoken.addResponder(new mx.rpc.Responder(saveCacheSuccess, savefault)); } else { Alert.show("No data available from Server to save on local DB"); } } private function saveCacheSuccess(event:SessionResultEvent):void { Alert.show("Data saved on client Sqlite DB from Server"); /* A new Insert is tried here. Note that this is not a complete user interface application. Otherwise, typically, users need to provide inputs to populate the Customer/Address Objects */ var cus:Customer = new Customer(); cus.cid=12; cus.name="New Customer"; var add:Address = new Address(); add.aid = 14; add.street = 'New Address'; cus.address = add; /* INSERT the new Records, this is first saved in client side SQLite DB. On the Commit operation this new record is saved in the Server side DB Notice that although you are saving the Customer object here, this operation saves even the binded Address Object also, as both the entities are CASCADED inside Customer Class */ var savetoken:SessionToken = session.save(cus); savetoken.addResponder(new mx.rpc.Responder(savesuccess, savefault)); } private function savesuccess(event:SessionResultEvent):void { Alert.show("Customer was Inserted Successfully"); // Load some otehr Customer(ex: id=11) so that we can perform Update on that Customer var loadtoken:SessionToken =session.loadByPK(Customer,{cid:11}); loadtoken.addResponder(new mx.rpc.Responder(loadCustomer,loadFault)) } private function loadCustomer(event:SessionResultEvent):void { var cus1:Customer = event.result as Customer; cus1.name = "UpdateCustomerName"; var add1:Address = new Address; add1.aid = 22; add1.street = 'UpdatedCustomerAddress'; cus1.address = add1; /* Let's call update now and save it to Client side SQLite DB */ var savetoken:SessionToken = session.update(cus1); savetoken.addResponder(new mx.rpc.Responder(updateSuccess,updatefualt)); } private function updateSuccess(event:SessionResultEvent):void { Alert.show("Customer was updated Successfully"); /* Let's Load another Customer(for example, with id 128) to perform a Delete operation on that */ var loadtoken:SessionToken = session.loadByPK(Customer,{cid:128}); loadtoken.addResponder(new mx.rpc.Responder(loadCustomerForDelete,loadFault)); } private function loadCustomerForDelete(event:SessionResultEvent):void { // pass the loaded customer to remove function var removetoken:SessionToken = session.remove(event.result); removetoken.addResponder(new mx.rpc.Responder(removeSuccess,removeFault)); } private function removeSuccess(event:SessionResultEvent):void { Alert.show("Customer was deleted Successfully"); } private function commit():void { /* Until now, you have performed Insert/Update/Delete operation on Customer/Address entities on the client side SQLite DB. Now use the Commit opertaion to send them to the Server. */ var committoken:SessionToken = session.commit(); committoken.addResponder(new mx.rpc.Responder(commitSuccess, commitFault)); } private function commitSuccess(event:SessionResultEvent):void { Alert.show("Server has been updated with local changes"); /* Now that you have completed all the operations, you can close the SQLite DB connection/session. It is a good practice to Close the session, after you complete all the operations. */ var closetoken:SessionToken = session.close(); closetoken.addResponder(new mx.rpc.Responder(sessionclosesuccess, sessionclosefault)); } private function sessionclosesuccess(event:SessionResultEvent):void { Alert.show("Session Close Success"); } // Fault Handlers private function fetchFault(event:SyncFaultEvent):void { Alert.show("fetch fault" + event.toString()); } private function conflictFault(event:SessionFaultEvent):void { Alert.show("conflict not resolved"); } private function connectFault(event:SessionFaultEvent):void { Alert.show("connect failure" + event.toString()); } private function sessionclosefault(event:SessionFaultEvent):void { Alert.show("Session Close Failed::"+event.error); } private function removeFault(event:SessionFaultEvent):void { Alert.show("Delete Operation Failed::"+event.error); } private function commitFault(event:SessionFaultEvent):void { Alert.show("Commit Failed::"+event.error); } private function loadFault(event:SessionFaultEvent):void { Alert.show("Load Failed::"+event.error); } private function updatefualt(event:SessionFaultEvent):void { Alert.show("update fault"+event.error); } private function savefault(event:SessionFaultEvent):void { Alert.show("Save Fault::"+event.error); } ]]> </mx:Script> <mx:Button click="commit()" name="commitbutton" label="Commit/write local data to Server"> </mx:Button> </mx:WindowedApplication> |