在本地,xml,txt,SharedObject已经可以用了。不过多了解点总是好的。之前用过my sql。来看这个,就比较轻松点。
* AIR提供了一套完善的SQL API,核心类位于flash.data包中。其中常见的类如下:
* flash.data.SQLConnection: 创建数据库的连接,并提供控制数据库操作的多个方法。
* flash.data.SQLStatement: 用来执行SQL语句(对表的操作吧)。
* flash.data.SQLResult: 用来获取SQL语句执行的结果。
* 使用数据库流程:首先使用SQLConnection创建库连接,然后通过SQLStatement执行SQL语句,最后从SQLResult对象中获取结果。
* AIR对文件的操作有异步和同步两种方式,同样,对SQL数据库的操作也一样。当你SQLConnection打开数据库的方式确定同步或异步之后,就不能中途修改了。选择何种方式,自己权衡。
* 打开模式三种:SQLMode.CREATE: 读写模式。如果数据库文件不存在,会自动创建。SQLMode.READ:只读模式,只能读操作。SQLMode.UPDATE:读写模式。如果数据库文件不存在时,则不会自动创建数据库。


air对数据库的操作。第一步,需要创建数据库,再连接数据库。对SQLConection的打开方式,当选择SQLMode.CREATE时,数据库不存在的情况下,会建立数据库。这个说法是不完全正确的。只有当所创建的数据库的上层目录存在时,才能创建成功。
如果不存在,我们需要用借助FileStream来创建了。代码如下:

            _file = File.documentsDirectory;
            _file = _file.resolvePath(url);
            if(!_file.exists)
            {
                _fs = new FileStream();
                _fs.open(_file,FileMode.WRITE);
                _fs.close();
            }
            
            _conn = new SQLConnection();
            _conn.openAsync(_file,SQLMode.CREATE);
            _conn.addEventListener(SQLErrorEvent.ERROR,errorHandler);
            _conn.addEventListener(SQLEvent.OPEN,openHandler);

 

创建表:

var sql:String = "CREATE TABLE IF NOT EXISTS diary ( diary_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
                        "diary_date FLOAT NULL,diary_title TEXT NULL,diary_content TEXT NULL )";

 

        /**
         * 
         *  创建表
         */        
        public function creatTable():void
        {
            var sql:String = "CREATE TABLE IF NOT EXISTS diary ( diary_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
                        "diary_date FLOAT NULL,diary_title TEXT NULL,diary_content TEXT NULL )";
            
            query(sql,createTableResult,errorResult);
            trace("创建一个表:");
        }

        private function query(sql:String , result:Function , fault:Function):void
        {
            trace(sql);

            if(_state != SQLSTATE_OPEN)
            {
                return;
            }
            
            if(!_st)
            {
                _st = new SQLStatement();
            }
            
            _st.sqlConnection = _conn;
            _st.text = sql;
            if(result && fault)
            {
                _st.execute( -1 ,new Responder(result, fault));
            }
            else
            {
                _st.execute();
            }
        }

 

添加数据:添加数据的时候,请注意字符串,当数据类型是字符串类型时,连接两边字符串需要字符串符号”。否则会报错。还有一点,向一个空表里边添加数据,主键id是从1开始的。

private var diaryList:Array = ["洞庭波冷晓侵云,日日征帆送远人。几度木兰舟上望,不知元是此花身。",
                                        "心属于你的,我借来寄托。却变成我的心魔。你属于谁的,我刚好经过。",
                                        "君生我未生,我生君已老。隔了百年的光阴,万里的迢递。浮世肮脏,人心险恶,割裂了生和死。到哪里去寻找那一袭纯白如羽的华衣和那莲花般的素颜",
                                        "秋风清,秋月明。落叶聚还散,寒鸦栖复惊。相思相见知何日,此时此夜难为情。",
                                        "仿佛有痛楚,如果我晕眩。那是因为幻觉丰盛,能量薄弱。足已支持我对你的迷恋,不够支持我们的快乐。",
                                        "我是有情情人,喜欢以眼还眼。眼里意乱情迷,心里迷途知返。我愿爱得沉默,沉默就是呐喊。心沧桑了,生活也就沧桑了。所以沧桑的你,千万别沧桑了你的心。",
                                        "于千万人之中,遇到你所要遇到的人。于千万年之中,时间无涯的荒野里,没有早一步,没有晚一步,恰好赶上了。那也没有别的话可说,唯有轻轻的说一声:‘噢,你也在这里吗’",
                                        "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。",
                                        "沧海月明珠有泪,蓝田日暖玉生烟。此情可待成追忆,只是当时已枉然。",
                                        "执手相看泪眼,竟无语凝噎。念去去,千里烟波,暮霭沉沉楚天阔。多情自古伤离别,更那堪冷落清秋节。今宵酒醒何处,杨柳岸,晓风残月。此去今年,应是良辰好景虚设。便纵有千种风情,更与何人说。",
                                        "尔今死去侬收葬,未卜侬身何日丧。侬今葬花人笑痴,他日葬侬知是谁。试看春残花尽落,便是红颜老死去。一朝春尽红颜老,花落人亡两不知。"];
        
        public function addDiary():void
        {
            var diaryContent:String = diaryList[Math.floor(diaryList.length * Math.random())];
            var diaryTitle:String = diaryContent.slice(0,10) + "。。。";
            var diaryDate:Number = new Date().getTime();
            var sql:String = "INSERT INTO diary(diary_date,diary_title,diary_content)values("+diaryDate + ", '" +diaryTitle+ "' , '" + diaryContent + "')";
            query(sql,addDiaryResult,errorResult);
            trace("添加一条日志:");
        }
        
        private function addDiaryResult(result:SQLResult):void
        {
            trace("创建日志成功:"  + "\n");
            //trace("插入的ID:" + result.lastInsertRowID);
            //trace("影响的行数:" + result.rowsAffected);
        }

 

更新数据:

public function updateDiary():void
        {
            var diaryContent:String = diaryList[Math.floor(diaryList.length * Math.random())];
            var diaryTitle:String = diaryContent.slice(0,10) + "。。。";
            var sql:String = "UPDATE diary SET diary_title = '" + diaryTitle + "' , diary_content = '" + diaryContent + "' WHERE diary_id = 1";
            query(sql,updateResult,errorResult);
            
            trace("更新数据id = 1的" );
        
        }
        
        private function updateResult(result:SQLResult):void
        {
            trace("更新成功"  + "\n");
        }

 

删除数据:

    public function deleteDiary():void
        {
            var sql:String = "DELETE FROM diary WHERE diary_id = 1";
            query(sql,deleteResult,errorResult);
            trace("删除数据id = 1的");

        }
        
        private function deleteResult(result:SQLResult):void
        {
            trace("删除成功"  + "\n");
        }

 

下边贴出完整代码:
文档类:

 

package
{
    import com.vini123.utils.Button;
    import com.vini123.utils.SqlOperate;
    
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    [SWF(width = "720" , height = "450" ,frameRate = "30")]
    public class SqlDemo extends Sprite
    {
        private var sql:SqlOperate;
        private var btNameList:Array = ["添加表","添加数据","查询数据","更新数据","删除数据"];
        public function SqlDemo()
        {
            
            sql  = new SqlOperate();
            sql.open("demo/sql/s3.db");
            
            var len:int = btNameList.length;
            var tempBtList:Vector.<Button> = new Vector.<Button>();
            for(var i:int = 0 ; i < len ; i++)
            {
                var bt:Button = new Button(btNameList[i]);
                bt.id = i;
                bt.buttonMode = true;
                bt.addEventListener(MouseEvent.CLICK,clickHandler);
                if(i ==0)
                {
                    bt.x = 10;
                }
                else
                {
                    bt.x = tempBtList[(i-1)].x + tempBtList[(i-1)].width + 10; 
                }
                bt.y = 10;
                tempBtList.push(bt);
                addChild(bt);
            }
        }
        
        private function clickHandler(e:MouseEvent):void
        {
            var id:int = e.currentTarget.id;
            
            switch(id)
            {
                case 0:
                    sql.creatTable();
                    break;
                case 1:
                    sql.addDiary();
                    break;
                case 2:
                    sql.selectDiary();
                    break;
                case 3:
                    sql.updateDiary();
                    break;
                case 4:
                    sql.deleteDiary();
                    break;
            }
        }
    }
}

 

SqlOperate.as:

/**
 *  AIR提供了一套完善的SQL API,核心类位于flash.data包中。其中常见的类如下:
 * flash.data.SQLConnection: 创建数据库的连接,并提供控制数据库操作的多个方法。
 * flash.data.SQLStatement: 用来执行SQL语句(对表的操作吧)。
 * flash.data.SQLResult:  用来获取SQL语句执行的结果。
 * 使用数据库流程:首先使用SQLConnection创建库连接,然后通过SQLStatement执行SQL语句,最后从SQLResult对象中获取结果。
 * AIR对文件的操作有异步和同步两种方式,同样,对SQL数据库的操作也一样。当你SQLConnection打开数据库的方式确定同步或异步之后,就不能中途修改了。选择何种方式,自己权衡。
 * 打开模式三种:SQLMode.CREATE: 读写模式。如果数据库文件不存在,会自动创建。SQLMode.READ:只读模式,只能读操作。SQLMode.UPDATE:读写模式。如果数据库文件不存在时,则不会自动创建数据库。
 * 
 *  
 */

package com.vini123.utils
{
    import flash.data.SQLConnection;
    import flash.data.SQLMode;
    import flash.data.SQLResult;
    import flash.data.SQLStatement;
    import flash.errors.SQLError;
    import flash.events.SQLErrorEvent;
    import flash.events.SQLEvent;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    import flash.net.Responder;

    public class SqlOperate
    {
        private var _file:File;
        private var _fs:FileStream;
        
        private var _conn:SQLConnection;
        private var _st:SQLStatement;
        
        private static const SQLSTATE_OPEN:String = "open";
        private static const SQLSTATE_CLOSE:String = "close";
        
        private var _state:String;
        public function SqlOperate()
        {
            
        }
        
        public function open(url:String):void
        {
            _file = File.documentsDirectory;
            _file = _file.resolvePath(url);
            if(!_file.exists)
            {
                _fs = new FileStream();
                _fs.open(_file,FileMode.WRITE);
                _fs.close();
            }
            
            _conn = new SQLConnection();
            _conn.openAsync(_file,SQLMode.CREATE);
            _conn.addEventListener(SQLErrorEvent.ERROR,errorHandler);
            _conn.addEventListener(SQLEvent.OPEN,openHandler);
        }
        
        private function openHandler(e:SQLEvent):void
        {
            _conn.removeEventListener(SQLErrorEvent.ERROR,errorHandler);
            _conn.removeEventListener(SQLEvent.OPEN,openHandler);
            _state= SQLSTATE_OPEN;
        }
        
        private function errorHandler(e:SQLErrorEvent):void
        {
            _conn.removeEventListener(SQLErrorEvent.ERROR,errorHandler);
            _conn.removeEventListener(SQLEvent.OPEN,openHandler);
            _state = SQLSTATE_CLOSE;
        }
        
        public function close():void
        {
            _conn.close();
        }
        
        private function query(sql:String , result:Function , fault:Function):void
        {
            trace(sql);

            if(_state != SQLSTATE_OPEN)
            {
                return;
            }
            
            if(!_st)
            {
                _st = new SQLStatement();
            }
            
            _st.sqlConnection = _conn;
            _st.text = sql;
            if(result && fault)
            {
                _st.execute( -1 ,new Responder(result, fault));
            }
            else
            {
                _st.execute();
            }
        }
        
        /**
         * 
         *  创建表
         */        
        public function creatTable():void
        {
            var sql:String = "CREATE TABLE IF NOT EXISTS diary ( diary_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
                        "diary_date FLOAT NULL,diary_title TEXT NULL,diary_content TEXT NULL )";
            
            query(sql,createTableResult,errorResult);
            trace("创建一个表:");
        }
        
        private function createTableResult(result:SQLResult):void
        {
            trace("创建表成功" + "\n");
        }
        
        private function errorResult(e:SQLError):void
        {
            trace("失败了"+ e);
        }
        
        
        /**
         * 添加日志 
         */        
        
        private var diaryList:Array = ["洞庭波冷晓侵云,日日征帆送远人。几度木兰舟上望,不知元是此花身。",
                                        "心属于你的,我借来寄托。却变成我的心魔。你属于谁的,我刚好经过。",
                                        "君生我未生,我生君已老。隔了百年的光阴,万里的迢递。浮世肮脏,人心险恶,割裂了生和死。到哪里去寻找那一袭纯白如羽的华衣和那莲花般的素颜",
                                        "秋风清,秋月明。落叶聚还散,寒鸦栖复惊。相思相见知何日,此时此夜难为情。",
                                        "仿佛有痛楚,如果我晕眩。那是因为幻觉丰盛,能量薄弱。足已支持我对你的迷恋,不够支持我们的快乐。",
                                        "我是有情情人,喜欢以眼还眼。眼里意乱情迷,心里迷途知返。我愿爱得沉默,沉默就是呐喊。心沧桑了,生活也就沧桑了。所以沧桑的你,千万别沧桑了你的心。",
                                        "于千万人之中,遇到你所要遇到的人。于千万年之中,时间无涯的荒野里,没有早一步,没有晚一步,恰好赶上了。那也没有别的话可说,唯有轻轻的说一声:‘噢,你也在这里吗’",
                                        "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。",
                                        "沧海月明珠有泪,蓝田日暖玉生烟。此情可待成追忆,只是当时已枉然。",
                                        "执手相看泪眼,竟无语凝噎。念去去,千里烟波,暮霭沉沉楚天阔。多情自古伤离别,更那堪冷落清秋节。今宵酒醒何处,杨柳岸,晓风残月。此去今年,应是良辰好景虚设。便纵有千种风情,更与何人说。",
                                        "尔今死去侬收葬,未卜侬身何日丧。侬今葬花人笑痴,他日葬侬知是谁。试看春残花尽落,便是红颜老死去。一朝春尽红颜老,花落人亡两不知。"];
        
        public function addDiary():void
        {
            var diaryContent:String = diaryList[Math.floor(diaryList.length * Math.random())];
            var diaryTitle:String = diaryContent.slice(0,10) + "。。。";
            var diaryDate:Number = new Date().getTime();
            var sql:String = "INSERT INTO diary(diary_date,diary_title,diary_content)values("+diaryDate + ", '" +diaryTitle+ "' , '" + diaryContent + "')";
            query(sql,addDiaryResult,errorResult);
            trace("添加一条日志:");
        }
        
        private function addDiaryResult(result:SQLResult):void
        {
            trace("创建日志成功:"  + "\n");
            //trace("插入的ID:" + result.lastInsertRowID);
            //trace("影响的行数:" + result.rowsAffected);
        }
        
        
        /**
         * 查询日志 
         */        
        
        public function selectDiary():void
        {
            var sql:String = "SELECT * FROM diary";
            query(sql,selectDiaryResult,errorResult);
            trace("查询所有日志:");
        }
        
        private  function selectDiaryResult(result:SQLResult):void
        {
            if(result)
            {
                var numRows:int = result.data.length;
                for(var i:int = 0 ; i< numRows ; i++)
                {
                    var row:Object = result.data[i];
                    trace("id: ",row.diary_id, " date: ",row.diary_date," title: ",row.diary_title);
                }
            }
            trace("\n");
        }
        
        /**
         *  更新数据
         */        
        public function updateDiary():void
        {
            var diaryContent:String = diaryList[Math.floor(diaryList.length * Math.random())];
            var diaryTitle:String = diaryContent.slice(0,10) + "。。。";
            var sql:String = "UPDATE diary SET diary_title = '" + diaryTitle + "' , diary_content = '" + diaryContent + "' WHERE diary_id = 1";
            query(sql,updateResult,errorResult);
            
            trace("更新数据id = 1的" );
        
        }
        
        private function updateResult(result:SQLResult):void
        {
            trace("更新成功"  + "\n");
        }
        
        /**
         * 删除数据 
         */        
        
        public function deleteDiary():void
        {
            var sql:String = "DELETE FROM diary WHERE diary_id = 1";
            query(sql,deleteResult,errorResult);
            trace("删除数据id = 1的");

        }
        
        private function deleteResult(result:SQLResult):void
        {
            trace("删除成功"  + "\n");
        }
    }
}

 

Button.as :

package com.vini123.utils
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    
    public class Button extends Sprite
    {
        private var _txtFormat:TextFormat;
        private var _txt:TextField
        private var _bottom:Sprite;
        private var _gap:int =15;
        private var _id:int;
        public function Button(label:String):void
        {
            _txtFormat = new TextFormat();
            _txtFormat.size = 24;
            _txtFormat.color = 0xADD0FC;
            
            _txt = new TextField();
            _txt.text = label;
            _txt.autoSize = TextFieldAutoSize.LEFT;
            _txt.setTextFormat(_txtFormat);
            _txt.mouseEnabled = false;
            addChild(_txt);
            
            _bottom = new Sprite();
            _bottom.graphics.lineStyle(1.0,0x2D72B5);
            _bottom.graphics.beginFill(0x0099ff,1);
            _bottom.graphics.drawRoundRect(0,0,_txt.textWidth + _gap *2,_txt.textHeight + _gap,5,5);
            _bottom.graphics.endFill();
            addChildAt(_bottom,0);
            
            _txt.x = _gap;
            _txt.y = _gap * 0.5 -1;
            
            this.addEventListener(MouseEvent.ROLL_OVER,overHandler);
            this.addEventListener(MouseEvent.ROLL_OUT,outHandler);
        }
        
        public function get id():int
        {
            return _id;
        }

        public function set id(value:int):void
        {
            _id = value;
        }

        private function overHandler(e:MouseEvent):void
        {
            _txt.alpha = 0.65;
        }
        
        private function outHandler(e:MouseEvent):void
        {
            _txt.alpha = 1;
        }
        
        public function dispose():void
        {
            _bottom.graphics.clear();
            this.removeEventListener(MouseEvent.ROLL_OVER,overHandler);
            this.removeEventListener(MouseEvent.ROLL_OUT,outHandler);
            if(this.parent)
            {
                this.parent.removeChild(this);
            }
        }
    }
}

 

添加这个数据,trace 结果:

[SWF] SqlDemo.swf - 解压缩后为 9,157 个字节
CREATE TABLE IF NOT EXISTS diary ( diary_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,diary_date FLOAT NULL,diary_title TEXT NULL,diary_content TEXT NULL )
创建一个表:
创建表成功

INSERT INTO diary(diary_date,diary_title,diary_content)values(1378650586781, '君生我未生,我生君已。。。' , '君生我未生,我生君已老。隔了百年的光阴,万里的迢递。浮世肮脏,人心险恶,割裂了生和死。到哪里去寻找那一袭纯白如羽的华衣和那莲花般的素颜')
添加一条日志:
创建日志成功:

INSERT INTO diary(diary_date,diary_title,diary_content)values(1378650591828, '君生我未生,我生君已。。。' , '君生我未生,我生君已老。隔了百年的光阴,万里的迢递。浮世肮脏,人心险恶,割裂了生和死。到哪里去寻找那一袭纯白如羽的华衣和那莲花般的素颜')
添加一条日志:
创建日志成功:

INSERT INTO diary(diary_date,diary_title,diary_content)values(1378650595500, '海上生明月,天涯共此。。。' , '海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。')
添加一条日志:
创建日志成功:

SELECT * FROM diary
查询所有日志:
id:  1  date:  1378650586781  title:  君生我未生,我生君已。。。
id:  2  date:  1378650591828  title:  君生我未生,我生君已。。。
id:  3  date:  1378650595500  title:  海上生明月,天涯共此。。。


UPDATE diary SET diary_title = '沧海月明珠有泪,蓝田。。。' , diary_content = '沧海月明珠有泪,蓝田日暖玉生烟。此情可待成追忆,只是当时已枉然。' WHERE diary_id = 1
更新数据id = 1的
更新成功

SELECT * FROM diary
查询所有日志:
id:  1  date:  1378650586781  title:  沧海月明珠有泪,蓝田。。。
id:  2  date:  1378650591828  title:  君生我未生,我生君已。。。
id:  3  date:  1378650595500  title:  海上生明月,天涯共此。。。


DELETE FROM diary WHERE diary_id = 1
删除数据id = 1的
删除成功

SELECT * FROM diary
查询所有日志:
id:  2  date:  1378650591828  title:  君生我未生,我生君已。。。
id:  3  date:  1378650595500  title:  海上生明月,天涯共此。。。


[卸装 SWF] SqlDemo.swf