Flex使用共享对象
可以使用Flex来把数据保存在客户端,即通过SharedObject类把数据保存在Flash Player中。共享对象与HTTP cookie很相似,但是功能更强大,因为可以在其中保存更加复杂的数据结构。
————————————数据放服务单还是客户端——————————————
数据是保存在客户端还是服务端,主要取决于数据的类型及目的。Flex应用程序可以像引用其他对象一样来引用本地共享对象中保存的数据。
共享对象具有如下一些特征:
A、 保存在终端用户的机器上,其位置由平台决定
B、 扩展名是.sol
C、 默认情况下它们的大小最多为100KB,用户可以调整大小限制,确定是否可以保存更大的对象
D、 可以包含复杂的数据结构
E、 不能包含方法或者函数
F、 终端用户必须手动删除它们或者通过编程来删除它们,删除浏览器cookie时,并不会删除Flex的共享对象。
G、 与cookies一样,共享对象不可以从不同的域读取。只有共享对象与SWF来自同一个域时,Flash Player才能够读取这个共享对象。
——————————————创建共享对象——————————————————
sharedObject类的getLocal()静态方法可以获取已有的共享对象。如果共享对象不存在,这个方法就会创建一个新的对象。所有的共享对象都是在Flash Player清楚SWF文件时写入磁盘的。如果想立即写入共享代码,则需调用flush()静态方法
var soMy:SharedObject = new SharedObject.getLocal("myCookie");
为了向共享对象添加数据,可以把变量作为共享对象的data属性的属性进行赋值。data是共享对象唯一内置的属性,例:
soMy.data.user = "Cloudy";
为了在共享对象里保存复杂的数据结构,待保存对象必须要在共享对象里进行初始化如:
soMy.data.aUsers = new Array();
soMy.data.aUsers = employees;
在共享对象里创建一个数组,并且把一个已有的数组employee放进这个共享对象中。
flush方法:
mySharedObject.flush(diskSpace)//diskSpace用来指定待创建的.sol文件的大小。默认最大容量为100KB, 如果试图保存一个更大的共享对象,Flash Player会显示Local Storage对话框,以便用户允许或者拒绝某个域所要访问的存储空间。
用户也可以为特定的域指定固定的存储空间: 右击播放器,选择settings,然后打开Local Storage对象框进行相应的设置。
————————————读取共享对象————————————————————
Flash Player读取共享对象,存在两种情况:
A、 如果相同名字的共享对象(在相同的域中)不存在,那么创建一个新的对象
B、 如果共享对象存在,那么其中的内容将被读取到共享对象的data属性中
一般在使用之前进行判断其是否存在
if(soMy.data.user!=undefined){...}
知道共享对象存在后,可以使用as来操作, 如下:
var soMy = sharedObject.getLocal("myCookie");
if(soMy.data.user!=undefined){
txtUserName.text = soMy.data.user;
}
可以像引用其他对象一样来引用共享对象的所有属性,但是不可以在共享对象中保存方法。
共享对象保存arrayCollection的例子:
public function saveCart():void{
this.soCart = SharedObject.getLocal("cartInfo");
this.soCart.data.aCart = new Array();
var len:int = aItems.length;
for(var i:int=0;i<len;i++){
this.soCart.data.aCart[i] = this.aItems.getItemAt(i);
}
}
SharedObject类只能保存As固有的数据结构, 比如对象数组,ArrayCollection以及值对象创建的对象不能保存在共享对象中。这些对象必须转换为对象数组。
——————————从已有的共享对象中读取数据————————————————
public function loadCart():void{
this.soCart = SharedObject.getLocal("cartInfo");
if(this.soCart.data.aCart != undefined){
var len:int = this.soCart.data.length;
for(var i:int=0; i<len; i++){
... ...
}
}
}