This is good stuff. Definitely thanks for the responses... -Cameron
On Wed, May 14, 2008 at 12:51 PM, jason_williams_mm <[EMAIL PROTECTED]> wrote: > You can skip the step of sending this to a ByteArray and > Base64Encoding it, by using the additional affinities added for AIR > applications. For example, using the following create statement: > > CREATE TABLE vo (objID String UNIQUE NOT NULL, objValue Object); > > You can then store the objects directly using a parameterized query > like the following: > > myStatement.text = "INSERT INTO vo VALUES (:objID, :objValue);"; > myStatement.parameters[":objID"] = vo.uid; > myStatement.parameters[":objValue"] = vo; > myStatement.execute(); > > Reading them out of the database is done with a simple select: > > myStatement.text = "SELECT objValue FROM vo WHERE objID = :objID"; > myStatement.parameters[":objID"] = textInput.text; > myStatement.execute(); > > The SQLResult.data property will then have a single object in the > array (should it be found) that is the stored object (no conversion > from bytearray, or encoding required). You still have to use the > [RemoteObject] metadata. Don't forget that this approach occludes the > object from creating selective queries, but, you can hoist properties > that are deemed necessary to columns in the table and allow searching > against those. > > > --- In flexcoders@yahoogroups.com, "jer_ela" <[EMAIL PROTECTED]> wrote: >> >> Here is one I have been working on. It serializes the object with AMF >> so it only needs one table. Note that your classes need to have a >> [RemoteClass] metadata tag ( no alias needed) in order for them to be >> deserialized correctly. Note that the static initialize method needs >> to be called before the class can be instantiated. >> >> package CloudSplitter.CodeGenerator.business >> { >> import flash.data.SQLConnection; >> import flash.data.SQLResult; >> import flash.data.SQLStatement; >> import flash.errors.SQLError; >> import flash.filesystem.File; >> import flash.utils.ByteArray; >> >> import mx.controls.Alert; >> import mx.utils.Base64Decoder; >> import mx.utils.Base64Encoder; >> >> public class PersistanceManager >> { >> static private var connection:SQLConnection; >> private var tableName:String = "persistant_object"; >> >> static public function >> initialize(persistanceDbName:String):void >> { >> if (connection == null) >> { connection = >> createConnection(persistanceDbName); >> } >> } >> >> static public function getConnection():SQLConnection >> { >> if (connection == null) >> { >> throw new Error("PersistanceManager has not >> been initialzed"); >> } >> else >> { >> return connection; >> } >> >> } >> >> public function PersistanceManager() >> { >> if (connection == null) >> { >> throw new Error("PersistanceManager can not be >> instantiated until >> it has been initialzed"); >> } >> } >> >> static private function >> createConnection(persistanceDbName:String):SQLConnection >> { >> var connection:SQLConnection = new SQLConnection(); >> var dbFile:File = >> File.applicationStorageDirectory.resolvePath(persistanceDbName); >> try >> { >> connection.open(dbFile); >> } >> catch (error:SQLError) >> { >> showError(error); >> } >> return connection; >> } >> >> public function createPersistanceTable():Boolean >> { >> var createStmt:SQLStatement = new SQLStatement(); >> createStmt.sqlConnection = connection; >> var sql:String = >> "CREATE TABLE IF NOT EXISTS " + tableName + " >> ( " + >> tableName + "_id INTEGER PRIMARY KEY >> AUTOINCREMENT" + >> " ,identifier TEXT UNIQUE NOT NULL" + >> " ,object_data BLOB" + >> ")"; >> createStmt.text = sql; >> try >> { >> createStmt.execute(); >> var success:Boolean = true; >> } >> catch (error:SQLError) >> { >> showError(error); >> success = false; >> } >> return success; >> } >> >> >> public function persistObject(identifier:String, >> object:Object):void >> { >> var byteArr:ByteArray = new ByteArray(); >> byteArr.writeObject(object); >> var encoder:Base64Encoder = new Base64Encoder(); >> encoder.encodeBytes(byteArr); >> var encoded:String = encoder.toString() >> var sqlResult:SQLResult = retrieveRecord(identifier); >> if (sqlResult.data == null) >> { >> var sql:String = >> "INSERT INTO " + tableName + >> " ( identifier, object_data ) " + >> " values ( '" + identifier + "', >> '" + encoded + "' )"; >> } >> else >> { >> sql = >> "UPDATE " + tableName + >> " SET object_data = '" + encoded >> + "' " + >> " where identifier = '" + >> identifier + "'"; >> } >> execSql(sql); >> } >> >> private function retrieveRecord(identifier:String): SQLResult >> { >> var sql:String = >> "SELECT * FROM " + tableName + >> " WHERE identifier = '" + identifier + >> "'"; >> >> var sqlResult:SQLResult = execSql(sql); >> return sqlResult >> } >> >> public function retrieveObject(identifier:String):Object >> { >> var sqlResult:SQLResult = retrieveRecord(identifier); >> var retrievedObject:Object; >> if (sqlResult.data != null) >> { >> var encodedObject:String = >> sqlResult.data[0].object_data; >> var decoder:Base64Decoder = new >> Base64Decoder(); >> decoder.decode(encodedObject); >> var byteArr:ByteArray = decoder.toByteArray(); >> retrievedObject = byteArr.readObject(); >> } >> return retrievedObject; >> } >> >> public function deleteObject(identifier:String):void >> { >> var sql:String = >> "DELETE FROM " + tableName + >> " WHERE identifier = '" + identifier + >> "'"; >> var result:SQLResult = execSql(sql); >> } >> >> private function execSql(sql:String):SQLResult >> { >> var statement:SQLStatement = new SQLStatement(); >> statement.text = sql; >> statement.sqlConnection = connection; >> statement.execute(); >> var sqlResult:SQLResult = statement.getResult(); >> return sqlResult >> } >> >> static private function showError(error:SQLError):void >> { >> Alert.show("Details: " + error.details, "Error >> message: " + >> error.message); >> } >> >> } >> } >> >> >> --- In flexcoders@yahoogroups.com, "Cameron Childress" <cameronc@> >> wrote: >> > >> > Is anyone aware of any Lightweight AIR Persistence mechanisms (in >> the spirit >> > of Hibernate) for VOs? I am working alot of AIR and SQLite and >> mostly when >> > I am using SQLite, I'm just mimicking the VO structure for storing >> objects >> > and then bringing them back out later. It's alot more code than I >> like to >> > write and it just doesn't feel right. >> > >> > I'd love to be able to say "myValueObject.save(dbAlias)" or >> > "myDBEngine.save(myValueObject)" and have my object stored in a >> SQLite DB >> > for later retrieval, creating tables on the fly as needed based on >> the VO's >> > property datatypes. Anyone aware of any efforts along these lines? >> > >> > Any other ways of looking at this problem that I am simply missing? >> > >> > -Cameron >> > >> > -- >> > Cameron Childress >> > Sumo Consulting Inc >> > http://www.sumoc.com >> > --- >> > cell: 678.637.5072 >> > aim: cameroncf >> > email: cameronc@ >> > >> > > > > ------------------------------------ > > -- > Flexcoders Mailing List > FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt > Search Archives: > http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! Groups Links > > > > -- Cameron Childress Sumo Consulting Inc http://www.sumoc.com --- cell: 678.637.5072 aim: cameroncf email: [EMAIL PROTECTED]