首页 > 代码库 > ShareObject 数据存储

ShareObject 数据存储

ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份演了这两种角色。而且ShareObject也是按此进行了两种分类,一类是LSO——Local Share Object(本地共享对象)其实类似于cookie,而另一种RSO——Remote Share Object(远程共享对象) 我感觉比较类似于JSP中的Application对象,但好象比Application更强大

一:LSO(本地共享对象)

LSO的用法比较简单,和我们平常操作Cookie大同小异:

1.得到一个共享对象:

var so:SharedObject=SharedObject.getLocal("mydata","/");

2.往共享对象里存入值:

var user:Object=new Object();

user.userName=userName.text;

user.passWord=passWord.text;

user.isSaveLogin=(remember.selected==true?1:0);

so.data.user=user;

3.清除共享对象里的值:

var so:SharedObject=SharedObject.getLocal("mydata","/");

if(so.data.user!=null){

so.data.user=null;

}

4.读取共享对象里的值:

var so:SharedObject=SharedObject.getLocal("mydata","/");

if(so.data.user!=null){

userName.text=so.data.user.userName;

passWord.text=so.data.user.passWord;

if(so.data.user.isSaveLogin.toString()=="1"){

remember.selected=true;

}

二:RSO(远程共享对象):

RSO是服务器端的共享对象,服务器端的数据共享可以实现多个客户端数据共享,在这里服务器我采用Flash Media Server3,FMS的使用非常简便,你只要在安装目录下找到Applications目录,并在其下新建一个子目录就可以成为你的工程或项目了。关于FMS的使用大家可以参考相关文章,本文不做介绍:利用FMS和RSO我们可以实现非常多的功能,诸如,聊天室,联机游戏,视频会议,在线视频录制和视频聊天。。。。。。

 public function init ():void  
  {    
rtmpGo = "rtmp://localhost/basicSO";//这里设置FMS服务器的连接地址,basicSO即为,
//FMS安装目录下Applications下自己手动新建的一个文件夹名称,也是FMS的工程名,就是这么简洁,不可意议
nc = new NetConnection( );//产生一个连接对象
nc.connect (rtmpGo);//连接到上面的地址
nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);//加入连接的监听事件,以便根据连接返回的状态做相应处理
}

private function doSO (e:NetStatusEvent):void
{
good=e.info.code == "NetConnection.Connect.Success";//判断是否为连接成功状态
//连接返回的状态有好几种,大家可以参看FMS的文档,很详尽
if (good)//如果连接成轼,执行如下操作
{
text_so=SharedObject.getRemote("test",nc.uri,false);//得到远程共享对象,false属性是设置共享的数据为非持久化的,
//即重启服务器后,先前的数据不会保存
text_so.connect (nc);
text_so.addEventListener (SyncEvent.SYNC,checkSO);
//为共享对象添加异步事件,这也是服务器同步处理多客户端最关键的地方,
//一个客户端进行了什么操作,其它客户端也会有相应的变化,就是通过此事件来完成的
}
}
private function sendMsg (e:MouseEvent):void
{
text_so.setProperty ("msg",textInput.text);//将新的信息存入共享对象
textArea.htmlText+=text_so.data.msg + "\n";//更新客户端的信息列表
}
private function checkSO (e:SyncEvent):void
{
for (var chng:uint; chng
{
switch (e.changeList[chng].code)
{
case "clear" :
break;

case "success" :
trace (text_so.data.msg);
break;

case "change" ://一个客户端改变数据会更新所有客户端
textArea.htmlText+=text_so.data.msg + "\n";
break;
}
}
}


1.首先,先在场景中建立一个动态文字框,并命名为msg_txt,以及三个按钮,别分为open_bt、close_bt、clear_bt等。
  2.在影格1输入下方的语法。
  var mwtSObj:SharedObject;
  function obj() {
  mwtSObj = SharedObject.getLocal("mSObj");
  var msg=mwtSObj.data.NOWmode;
  if (msg !=null) {
  msg_txt.text=msg;
  } else {
  msg_txt.text="";
  }
  }
  obj();
  open_bt.addEventListener(MouseEvent.CLICK,openObj);
  close_bt.addEventListener(MouseEvent.CLICK,closeObj);
  clear_bt.addEventListener(MouseEvent.CLICK,clearObj);
  function openObj(e:MouseEvent) {
  mwtSObj.data.NOWmode="开";
  obj();
  }
  function closeObj(e:MouseEvent) {
  mwtSObj.data.NOWmode="关";
  obj();
  }
  function clearObj(e:MouseEvent) {
  mwtSObj.data.NOWmode="";
  obj();
}




package
{
        import flash.display.Sprite;
        import flash.events.NetStatusEvent;
        import flash.net.SharedObject;
        import flash.net.SharedObjectFlushStatus;

        
        public class ShareTest extends Sprite {
                
                
                public  var  socre:int = 100;  // 这个是你的得分 
                private var mySo:SharedObject;
                
                public function ShareTest() {

                        readValue();
                }
                public function readValue():void
                {
                        mySo = SharedObject.getLocal("application-name");
                        trace("SharedObject 读取...\n");
                        trace("读取结果为 : " + mySo.data.savedValue + "\n\n");
                        
                        if(socre > mySo.data.savedValue || mySo.data.savedValue =http://www.mamicode.com/= undefined)
                        {
                                 saveValue(socre);
                        }
                
                }
                public function saveValue(_value:int):void {
                        trace("存储中...\n");
                        mySo.data.savedValue = _value;
                        
                        var flushStatus:String = null;
                        try {
                                flushStatus = mySo.flush(10000);
                        } catch (error:Error) {
                                trace("存储失败");
                        }
                        if (flushStatus != null) {
                                switch (flushStatus) {
                                        case SharedObjectFlushStatus.PENDING:
                                                trace("存储量超标了...\n");
                                                mySo.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
                                                break;
                                        case SharedObjectFlushStatus.FLUSHED:
                                                trace("分数成功刷新到磁盘\n");
                                                break;
                                }
                        }
                        trace("\n");
                }
                //清空存储
                public function clearValue():void {
                        delete mySo.data.savedValue;
                }
                
                public function onFlushStatus(event:NetStatusEvent):void {
                        switch (event.info.code) {
                                case "SharedObject.Flush.Success":
                                        trace("用户授予权限——值保存.\n");
                                        break;
                                case "SharedObject.Flush.Failed":
                                        trace("用户拒绝——价值未保存.\n");
                                        break;
                        }
                        trace("\n");
                        
                        mySo.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
                }
                

        }
}



public static var mySo:SharedObject;
                /**
                 * 把数据保存到本地
                 * @param dataName 要保存的对象名称
                 * @param data 要保存的数据
                 * @param name 参数共享对象名,返回共享对象的参照
                 * @return
                 *
                 */               
                public static function saveData(dataName:String,data:Object,name:String="localhostObj"):void
                {
                        mySo = SharedObject.getLocal(name,"/");
                        mySo.data[dataName] = data;
                        //强制保存数据,flush可带时间参数,默认为0
                        mySo.flush();
                }
                /**
                 * 读取本地数据,如果没有该数据,返回null值
                 * @param dataName 数据的名称
                 * @param name 参数共享对象名,返回共享对象的参照
                 * @return
                 *
                 */               
                public static function getData(dataName:String,name:String="localhostObj"):Object
                {
                        mySo = SharedObject.getLocal(name,"/");
                        if(mySo.data[dataName] != null)
                        {
                                return mySo.data[dataName];
                        }
                        return null;
                }



var mySO:SharedObject = SharedObject.getLocal("republicofcode");
logo_mc.x = mySO.data.my_x;
logo_mc.y = mySO.data.my_y;
if (!mySO.data.my_y) {
logo_mc.x = 150;
logo_mc.y = 100;
}
logo_mc.addEventListener (MouseEvent.MOUSE_DOWN, onDown);
function onDown (e:MouseEvent):void {
var my_mc = e.target;
my_mc.startDrag ();
}
logo_mc.addEventListener (MouseEvent.MOUSE_UP, onUP);
function onUP (e:MouseEvent):void {
logo_mc.stopDrag ();
mySO.data.my_x = logo_mc.x;
mySO.data.my_y = logo_mc.y;
mySO.flush ();
}
logo_mc.buttonMode=true;




就是flash的配色游戏,点一个元件这个元件是个颜色,然后再点衣服,衣服就染成那个颜色(已实现),现在想点保存按钮,把配色保存下来,然后再打开swf后点读取可以把上一次配色显示出来。

部分代码:
var game:MovieClip=null;
var w:int=0;
var mc:MovieClip;
var color:uint;
var so:SharedObject;
if(!so)
{
     so=SharedObject.getLocal("game","/")//这里的game你可以取其他合法的名字
}
function InitLevel(m:MovieClip):void
{
    for(var i:int = 1;i<=20;i++)
    {
        
        mc = m.getChildByName("a"+i);
        if(mc!=null)
        {
            mc.addEventListener(MouseEvent.CLICK,onPaint);
        }
    }
}
//a1,a2,...是那些衣服裤子的元件。

function onPeekColor(e:MouseEvent):void
{
    
    switch (e.currentTarget)
    {
        case btnColor1 :
            color = 0xffffff;
            break;
        case btnColor2 :
            color = 0x37AA00;
            break;
        case btnColor3 :
            color = 0xFFD326;
            break;
        case btnColor4 :
            color = 0x3366FF;
            break;
        case btnColor5 :
            color = 0xFF9900;
            break;
        case btnColor6 :
            color = 0xA852DC;
            break;
        case btnColor7 :
            color = 0xCC0000;
            break;
        case btnColor8 :
            color = 0xFF6ACF;
            break;
        case btnColor9 :
            color = 0x8A5F0D;
            break;
        case btnColor10 :
            color = 0x000000;
            break;
    }
    
    var ct:ColorTransform = new ColorTransform();
    ct.color=color;
        so.data.mycolor=ct.color;
    xiguan.yanliao.transform.colorTransform=ct;
}

function onPaint(e:MouseEvent):void
{
    var mc:MovieClip = e.currentTarget;
    mc.transform.colorTransform=xiguan.yanliao.transform.colorTransform;
}

 

ShareObject 数据存储