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" <[EMAIL PROTECTED]>
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: [EMAIL PROTECTED]
>


Reply via email to