可以使用 SharedObject 对象的
data
属性将数据添加至
SharedObject
的 * .sol 文件中。要将新数据添加到共享对象,请使用下面的语法:
sharedObject_name.data.variable = value;
以下示例将
userName
、
itemNumbers
和
adminPrivileges
属性及其值添加到 SharedObject 中:
public var currentUserName:String = "Reiner";
public var itemsArray:Array = new Array(101,346,483);
public var currentUserIsAdmin:Boolean = true;
mySO.data.userName = currentUserName;
mySO.data.itemNumbers = itemsArray;
mySO.data.adminPrivileges = currentUserIsAdmin;
为
data
属性赋值后,必须强制 Flash Player 将这些值写入 SharedObject 文件。要强制 Flash Player 将这些值写入 SharedObject 文件,请使用
SharedObject
.
flush()
方法,如下所示:
mySO.flush();
如果未调用
SharedObject.flush()
方法,Flash Player 会在应用程序退出时将值写入该文件。但是,如果该数据超出默认设置,用户将失去增加 Flash Player 可用空间来存储该数据的机会。因此,较好的做法是调用
SharedObject.flush()
。
使用
flush()
方法将共享对象写入用户的硬盘驱动器时,应仔细检查用户是否已使用 Flash Player 设置管理器 (
www.macromedia.com/support/documentation/cn/flashplayer/help/settings_manager07.html
) 明确禁用了本地存储,如下面的示例所示:
var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();
在共享对象中存储对象
可以将简单对象(如数组或字符串)存储到 SharedObject 的
data
属性中。
在以下示例中,一个 ActionScript 类定义了一些控制与共享对象进行交互的方法。用户可以使用这些方法将对象添加到共享对象中或从共享对象中删除对象。此类将存储一个包含简单对象的 ArrayCollection。
package {
import mx.collections.ArrayCollection;
import flash.net.SharedObject;
public class LSOHandler {
private var mySO:SharedObject;
private var ac:ArrayCollection;
private var lsoType:String;
// The parameter is "feeds" or "sites".
public function LSOHandler(s:String) {
init(s);
}
private function init(s:String):void {
ac = new ArrayCollection();
lsoType = s;
mySO = SharedObject.getLocal(lsoType);
if (getObjects()) {
ac = getObjects();
}
}
public function getObjects():ArrayCollection {
return mySO.data[lsoType];
}
public function addObject(o:Object):void {
ac.addItem(o);
updateSharedObjects();
}
private function updateSharedObjects():void {
mySO.data[lsoType] = ac;
mySO.flush();
}
}
}
下面的 Flex 应用程序为所需的每个共享对象类型创建一个 ActionScript 类的实例,然后在用户添加或删除博客或站点 URL 时调用该类的方法。
<?xml version="1.0"?>
<!-- lsos/BlogAggregator.mxml -->
<mx:Application
xmlns:local="*"
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="initApp()"
backgroundColor="#ffffff"
>
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
import flash.net.SharedObject;
[Bindable]
public var welcomeMessage:String;
[Bindable]
public var localFeeds:ArrayCollection = new ArrayCollection();
[Bindable]
public var localSites:ArrayCollection = new ArrayCollection();
public var lsofeeds:LSOHandler;
public var lsosites:LSOHandler;
private function initApp():void {
lsofeeds = new LSOHandler("feeds");
lsosites = new LSOHandler("sites");
if (lsofeeds.getObjects()) {
localFeeds = lsofeeds.getObjects();
}
if (lsosites.getObjects()) {
localSites = lsosites.getObjects();
}
}
// Adds a new feed to the feeds DataGrid.
private function addFeed():void {
// Construct an object you want to store in the
// LSO. This object can contain any number of fields.
var o:Object = {name:ti1.text, url:ti2.text, date:new Date()};
lsofeeds.addObject(o);
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method.
localFeeds = lsofeeds.getObjects();
// Clear the text fields.
ti1.text = '';
ti2.text = '';
}
// Removes feeds from the feeds DataGrid.
private function removeFeed():void {
// Use a method of ArrayCollection to remove a feed.
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method. You do not need
// to update it manually.
if (myFeedsGrid.selectedIndex > -1) {
localFeeds.removeItemAt(myFeedsGrid.selectedIndex);
}
}
private function addSite():void {
var o:Object = {name:ti3.text, date:new Date()};
lsosites.addObject(o);
localSites = lsosites.getObjects();
ti3.text = '';
}
private function removeSite():void {
if (mySitesGrid.selectedIndex > -1) {
localSites.removeItemAt(mySitesGrid.selectedIndex);
}
}
]]>
</mx:Script>
<mx:Label text="Blog aggregator" fontSize="28"/>
<mx:Panel title="Blogs">
<mx:Form id="blogForm">
<mx:HBox>
<mx:FormItem label="Name:">
<mx:TextInput id="ti1" width="100"/>
</mx:FormItem>
<mx:FormItem label="Location:">
<mx:TextInput id="ti2" width="300"/>
</mx:FormItem>
<mx:Button id="b1" label="Add Feed" click="addFeed()"/>
</mx:HBox>
<mx:FormItem label="Existing Feeds:">
<mx:DataGrid
id="myFeedsGrid"
dataProvider="{localFeeds}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b2" label="Remove Feed" click="removeFeed()"/>
</mx:Form>
</mx:Panel>
<mx:Panel title="Sites">
<mx:Form id="siteForm">
<mx:HBox>
<mx:FormItem label="Site:">
<mx:TextInput id="ti3" width="400"/>
</mx:FormItem>
<mx:Button id="b3" label="Add Site" click="addSite()"/>
</mx:HBox>
<mx:FormItem label="Existing Sites:">
<mx:DataGrid
id="mySitesGrid"
dataProvider="{localSites}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b4" label="Remove Site" click="removeSite()"/>
</mx:Form>
</mx:Panel>
</mx:Application>
在共享对象中存储指定了类型的对象
可以在共享对象中存储指定了类型的 ActionScript 实例。通过调用
flash.net.registerClassAlias()
方法来注册类可以实现此目的。如果创建了类的实例并将该实例存储在共享对象的数据成员中,而以后要读出该对象,则将得到指定了类型的实例。默认情况下,SharedObject
objectEncoding
属性支持 AMF3 编码,并从 SharedObject 对象中解包存储的实例;存储的实例将保持您调用
registerClassAlias()
方法时指定的同一类型。