U kunt gegevens toevoegen aan een *.sol-bestand van
SharedObject
door gebruik te maken van de eigenschap
data
van het SharedObject-object. Gebruik de volgende syntaxis om nieuwe gegevens toe te voegen aan het gezamenlijke object:
sharedObject_name.data.variable = value;
In het volgende voorbeeld worden de eigenschappen
userName
,
itemNumbers
en
adminPrivileges
en hun waarden toegevoegd aan een 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;
Wanneer u waarden hebt toegewezen aan de eigenschap
data
, moet u Flash Player opdragen die waarden naar het SharedObject-bestand te schrijven. Om Flash Player te dwingen de waarden naar het SharedObject-bestand te schrijven, gebruikt u de methode
SharedObject
.
flush()
als volgt:
mySO.flush();
Als u de methode
SharedObject.flush()
niet aanroept, schrijft Flash Player de waarden naar het bestand wanneer de toepassing wordt afgesloten. Dit biedt de gebruiker echter niet de gelegenheid om de beschikbare ruimte te vergroten die Flash Player heeft om de gegevens op te slaan als de gegevens groter zijn dan de standaardinstellingen. Het is daarom een goed idee om
SharedObject.flush()
aan te roepen.
Als u de methode
flush()
gebruikt om gezamenlijke objecten naar de vaste schijf van de gebruiker te schrijven, moet u controleren of de gebruiker lokale opslag expliciet heeft uitgeschakeld via Settings Manager van Flash Player (
www.macromedia.com/support/documentation/nl/flashplayer/help/settings_manager07.html
), zoals in het volgende voorbeeld:
var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();
Objecten opslaan in gezamenlijke objecten
U kunt eenvoudige objecten, zoals arrays of tekenreeksen opslaan in de eigenschap
data
van een SharedObject.
In het volgende voorbeeld definieert de klasse ActionScript methoden waarmee de interactie met het gezamenlijke object wordt geregeld. Met deze methoden kan de gebruiker objecten aan het gezamenlijke object toevoegen of eruit verwijderen. In deze klasse wordt een ArrayCollection opgeslagen die eenvoudige objecten bevat.
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();
}
}
}
Met de volgende Flex-toepassing wordt een instantie van de klasse ActionScript gemaakt voor elk type gezamenlijk object dat nodig is. Vervolgens worden methoden aangeroepen op die klasse wanneer de gebruiker blogs of site-URL's toevoegt of verwijdert.
<?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>
Objecten met typen opslaan in gezamenlijke objecten
U kunt instanties van ActionScript met type opslaan in gezamenlijke objecten. Dit doet u door de methode
flash.net.registerClassAlias()
aan te roepen om de klasse te registreren. Als u een instantie van de klasse maakt en deze opslaat in het gegevenslid van het gezamenlijke object en het object later uitleest, krijgt u een instantie met een type. Standaard ondersteunt de SharedObject-eigenschap
objectEncoding
AMF3-codering en wordt de opgeslagen instantie uit het SharedObject-object uitgepakt; de opgeslagen instantie houdt het type dat u hebt opgegeven toen u de methode
registerClassAlias()
aanriep.