在本地,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