flash,AIR的本地存儲初步瞭解

呃,只是今天在做手機上的air程序的存儲,所以稍微看了下flash,air的存儲本地數據方面的知識。

存儲本地數據的方法其實有不少,最簡單的就是用shareObject了,的確是最簡單的了,基本屬於零基礎就能用的了。shareObject直譯爲共享對象(有時稱爲“Flash cookie”)是一個數據文件,可以將數據存儲到用戶的本地硬盤上,然後在同一會話期間或以後的會話中調用這些數據。各應用程序僅能訪問它們自己的 SharedObject 數據,而且僅當它們在同一域中運行時才能訪問。不會將這些數據發送到服務器,並且在其他域中運行的其他應用程序不能訪問這些數據,但同一域中的應用程序可以訪問這些數據。

共享對象有以下屬性:
• 默認情況下不會到期。
• 默認情況下,每個共享對象的大小限制爲 100 KB。
• 可以存儲簡單的數據類型(例如字符串、數組和日期等)。
• 存儲在應用程序指定的位置(位於用戶的主目錄中)。
• 永遠不會在客戶端和服務器之間傳輸。
可以看出,ShareObject的限制就是單個文件大小不能超過100k,但是這些對於存儲小的數據也綽綽有餘了。另外,假如保存成功的話共享對象的大小將超過 100 KB,則 Flash Player 將顯示“ 本地存儲區” 對話框,用戶可在該對話框中允許或拒絕爲請求訪問的域增加本地存儲區。

ShareObject的方法有
clear()清除數據,刪除ShareObject;
flush()立即將數據刷入文件;
getLocal()返回ShareObject的引用,不存在的話就新建一個(很方便)
getSize()獲取存儲數據的文件大小

使用的方法如下:

public var mySO:SharedObject;
mySO = SharedObject.getLocal("preferences");

這樣就可以在默認的用戶主目錄的子目錄下創建一個叫做preferences.sol的文件了,裏面存有數據
這個目錄在不同系統下會有變化(但是一般的話,其實不用太過關注...因爲這一切都是自動的)
So.data.first = "animal";這樣就可在first上存一個"animal"值了
讀的時候直接用So.data.first就可以了


其他的還有個就是數據加密的問題,這裏需要注意的一個是在用air開發Android應用時,Android 操作系統爲每個應用程序分配一個單獨的用戶 ID。應用程序只能訪問自己的文件和在公共位置創建的文件(如移動存儲卡)。注意,在 Android 的“ 根” 設備上,使用根權限運行的應用程序可以訪問其他應用程序的文件。因此,在根設備上,加密的本地存儲不提供與非根設備上級別一樣高的數據保護。


另外再說一個air裏的File類,
File 對象表示文件或目錄的路徑。這可以是現有的文件或目錄,也可以是尚不存在的文件或目錄(例如,它可以表示希望創建的文件或目錄的路徑)。
File 類包含一些靜態屬性,供引用常用目錄位置。這些靜態屬性包括:
•File.applicationStorageDirectory — 每個已安裝的 AIR 應用程序獨有的存儲目錄
•File.applicationDirectory — 安裝應用程序的只讀目錄(其中包括所有已安裝的資源)
•File.desktopDirectory — 用戶的桌面目錄
•File.documentsDirectory — 用戶的文檔目錄
•File.userDirectory — 用戶目錄
有了這些屬性,就可以不用擔心因爲使用了文本常量形式的本機路徑(如"C:\Documents and Settings\test.txt"),結果只在一個平臺上有效的問題了。
跨平臺的時候效果很好,使用示例如下,此代碼會指向應用程序存儲目錄中的 preferences.xml 文件
var prefsFile:File = File.applicationStorageDirectory;
  prefsFile = prefsFile.resolvePath("preferences.xml");
但是要注意的一點是File.applicationDirectory是個只讀目錄,所以不能直接利用這個地址寫入,但是用一個new之後,問題就可以得到解決

var file:File = new File(File.applicationDirectory.resolvePath("preferences.xml").nativePath);

下面這個例子演示瞭如何讀入本地的xml數據文件,修改其中數據的過程。

var countFile:File = new File(File.applicationDirectory.resolvePath("Levels/levelCount.xml").nativePath);
			
//open for the first time
var fileStream:FileStream = new FileStream();
fileStream.open(countFile,FileMode.READ);
			
var content:XML = new XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
content.cnt=(currentLevel+1).toString();
			
//open for the second time in order to write data
fileStream.open(countFile,FileMode.WRITE);
fileStream.writeUTFBytes(content.toXMLString());
fileStream.close();


另外的話,其實還有很多種方法(如在 AIR 中使用本地 SQL 數據庫),每一種深入的話也都可以很深入...
雖然現在已經在使用的是這麼用,不過因爲理解的不是很深,所以有些地方的限制還不太瞭解...以後再看看有沒有機會加深理解來修正,更新筆記吧~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章