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
プロパティに値を割り当てた後、これらの値を SharedObject のファイルに書き込むように Flash Player に指示する必要があります。Flash Player によって強制的に SharedObject のファイルに値を書き込むには、次のように
SharedObject
.
flush()
メソッドを使用します。
mySO.flush();
SharedObject.flush()
メソッドを呼び出さない場合は、アプリケーションの終了時に Flash Player によって値がファイルに書き込まれます。ただし、データがデフォルト設定を超える場合に、Flash Player でそのデータの格納に使用可能なスペースを増やす機会はユーザーに与えられません。したがって、
SharedObject.flush()
を呼び出すことをお勧めします。
flush()
メソッドを使用してユーザーのハードディスクに共有オブジェクトを書き込む場合は、次の例に示すように、Flash Player の設定マネージャー(
www.macromedia.com/support/documentation/jp/flashplayer/help/settings_manager07.html
)を使用してローカル記憶領域を明示的に無効にしてあるかどうかを慎重に確認する必要があります。
var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();
共有オブジェクトへのオブジェクトの格納
Array や String などの単純なオブジェクトは、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()
メソッドを呼び出したときに指定したものと同じ型が保持されます。