AIR 程序开发系列 之五 保存数据的几种方式
Local SharedObject
这种方法比较简单方便的保存少的数据到到设备中。你不用自己去管理这些数据,设备会自动管理他。
SharedObject 在 flash.net 包中,继承自EventDispatcher .
ShareObject 和浏览器中的cookie 类似,但是他不会过期,而且有一个默认的大小限制为100K。他是AMF格式的数据。可以存储Array,Object,XML,Number,等各种数据类型。使用方法:
import flash.net.SharedObject;
//获取SharedObject ,如果存在,则获取,如果不存在则创建。
var so:SharedObject=SharedObject.getLocal("myApplication");
//添加数据
so.data.animal="Hamseter";
so.data.food=["Grains","Avodcado","carrot"];
//保存数据
so.flush();
//检查flush 的状态
var flushStatus:String=so.flush();
if(flushStatus!=null)
{
switch(flushStatus)
case SharedObjectFlushStatus.PENDING:
so.addEventListener(NetStatusEvent.NET_STATUS.onFlushStatus);
break;
case SharedObjectFlushStatus.FLUSHED:
trace("scuccess")
break;
}
private function onFlushStatus(event:NetStatusEvent):void
{
trace(event.info.code)
}
//显示所有的属性
for (var i:String in so.data)
{
trace("prop",i,";",so.data[i])
}
//大小
so.size()
//删除
delete so.data.animal
//清空
so.clear()
文件系统
文件系统对于使用电脑的人来说并不陌生。可以读取,写入,移动和删除文件,组织方式是有等级目录的。在AIR Android 中
存储目录或者是SD卡的文件能被创建和修改。
File 类在flash.filesystem 中,集成自FileRference 类。即可以代表文件,也可以代表目录。
如:
import flash.filesystem.File;
var file:File=File.applicationStroageDirectory.resovePath("hello.text");
//创建文件夹,并且给文件夹中添加文件
import flash.filesystem.FileStream;
import flash.filesystem.FileMode
var folder:File=File.applicationDirectory.resolvePath("greetings");
if(!folder.exists)
{
folder.createDirectory();
}
var file:File=folder.resolvePath("hello.txt");
//读文件:
var fileStream:FileStream=new FileStream();
fileStream.open(file,FileMode.READ);
var st:String=fileStream.readUTFBytes(fileStream.bytesAvailable);
fileStram.close();
trace(st)
fileStream.close();
//delete file
file.deleteFile();
//delete directory
file.deleteDirectory(true)
同步与异步
异步读取文件
var fileStream:FileStream=new FileStream();
fileStream.addEventListener(ProgressEvent.PROGRESS,onProgress);
fileStream.addEventLIstener(Event.COMPLETE,onComplete);
fileStream.openAsync(file,FileMode.READ);
private function onProgress(event:ProgressEvent):void
{
trace(fileStream.bytesAvailabel)
}
private function onComplete(event:Event):void
{
fileStream.removeEventListener(ProgressEvent.PROGRESS,onProgress);
fileStream.removeEventListener(ProgressEvent.COMPLETE,onComplete);
var byteArray:ByteArray=fileStream.bytesAvailable;
fileStream.close();
}
临时文件
//
var tempDirectory:File=File.CreateTempDirectory();
var tempFile:File=File.createTempFile();
//删除
tempFile.deleteFile();
tempDirectory.deleteFile();
//回收,因为Android 中没有回收站,所以回收就是删除
tempFile.moveToTrash();
tempDirectory.moveToTrash();
SQLite 数据库
使用sqlite 数据库系统是为了解决本地缓存的另一个方案,当持久层的数据比较复杂,或者是你想一不同的方式来组织数据,或者你是想私有化你自己的数据。
AIR 运行环境就包含了sql 数据的引擎,用来创建,组织和维护数据,使用的是开源的sqlite 数据库。他不会去使用android os 的sqlite 框架。
Sql 类在flash.data 包中。
这里也可以使用同步与异步的方式,为了简单起见,本节采用异步的模型。
创建数据库文件:
代码:import flash.fileSystem.File;
private function createDataBase():void
{
var file:File=File.applicationStorageDirectory.resolvePath("myData.db");
if(file.exists)
{
trace(" already exist")
}
else
{
trace("not exist")
}
}
//打开数据文件
import flash.data.SQLconnection
private var connection:SQLconnection;
connection=new SQLConnection();
//open file
try
{
connection.open(file);
trace("Opend")
}
catch(error:Error){
}
//创建表
import flash.data.SQLStatement;
import flash.data.SQLMode;
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
var request:String="CREATE TABLE IF NOT EXIST geography(id interger primary key autoincrement,country text,cite text)";
statement.text=request;
try
{
statement.execute();
}
catch(error:Error)
{
trace(error)
}
//add data
var statement:SQLStatement=new SLQStatement();
statement.sqlConnection=connection;
var insert:String="insert into geography(coungtry,cite)values('france','paris')";
statment.text=insert;
try
{
statment.execute();
}
catch(e:Error)
{
trace(e)
}
//如果数据时动态的
addItem({country:"France",city:"Paris"});
private function addItem(object:Object):void
{
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
var insert:String="insert into geography(coungry,city)values(?,?)";
statement.text=insert;
statment.parameters[0]=object.country;
statment.parameters[1]=object.city;
try
{
statment.execute();
}
catch(e:Error)
{
trace(e)
}
}
//请求数据:
import flash.data.SQLResult;
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
statement.text="select * from geography";
statement.addEventListener(SQLEvent.RESULT,selectReceived);
statement.execute();
private function selectReceived(event:SQLEvent):void
{
statement.removeEventListener(SQLEvent.RESULT,selectReceived);
var result:SQLResult=statement.getResult();
if(result!=null)
{
var rows:int=result.data.length;
for(var i:int=0;i<rows;i++)
{
var row:Object=result.data[i];
trace(row.id+row.country,row.city)
}
}
}
//查询一个结果
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
statement.text="select * from geography where country=:c";
statement.addEventListener(SQLEvent.RESULT,selectReceived);
statement.parameters[":c"]=mycity;
//execute(1) 表示只有一个返回
statement.execute(1);
var result:SQLResult=statement.getResult();
if(result.data!=null)
{
trace(result.data.country)
}
//edit 数据
modifyItem("UNIted","dc");
private function modifyItem(myCountry:String,myCity:String):void
{
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
var updateMessage:String="update geography set city=:ci where country=:c0";
satement.text=updateMessage;
statement.parameters[":c0"]=myCountry;
statement.parameters[":c1"]=myCity;
try
{
statement.execute();
}catch(e:Error)
{
trace(e)
}
}
// 删除
private function deleteItem(myCountry:String):void
{
var statement:SQLStatement=new SQLStatement();
statement.sqlConnection=connection;
var deleteMessage:String="delete from geograhy where countr=:a";
statement.text=deleteMessage;
statement.parameters[":a"]=myCountry;
try
{
statment.execute()
}catch(e:Error)
{
trace(e)
}
}
//加密数据库:
import flash.utils.BytaArray;
import flash.data.EncryptedLocalStore;
//加密
function write():void
{
var myData:ByteArray=new ByteArray();
myData.writeUTFBytes("my very sensitive data");
EncryptedLocalStore.setItem("mykey",myData);
}
//解密:
function read():void
{
var mydata:ByteArray=EncryPtedLocaoStore.getItem("myKey");
if(myData=null)
{
trace(myData.readUTFBytes(mydata.bytesAvailabel));
}
}
//删除:
function delte():void
{
EncryptedLocalStore.removeItem("myKey");
}
结论:
本节讲述了多种方法来保存持久化数据。可以去拓展你的保存数据的方法,以及子定义保存数据的方法。
AIR 程序开发系列 之五 保存数据的几种方式的更多相关文章
- iOS保存数据的4种方式
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...
- 微信小程序开发3之保存数据及页面跳转
第一 保存本地数据 1.异步保存本地数据 wx.setStorage({ key:keyStr, data:dataStr, success: function(e){}, fail: functi ...
- spark sql中保存数据的几种方式
从官网来copy过来的几种模式描述: Scala/Java Python Meaning SaveMode.ErrorIfExists(default) "error"(defau ...
- servlet保存数据的几种方式
In Servlets you have 4 scopes where you can store data. Application Session Request Page
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- ASP.NET4.5Web API及非同步程序开发系列3
ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...
- ASP.NET4.5Web API及非同步程序开发系列
ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...
- WordPress版微信小程序开发系列(二):安装使用问答
自WordPress版微信小程序发布开源以来,受关注的程度超过我原来的想象.这套程序主要面对的用户是wordpress网站的站长,如果wordpress站想在微信的生态圈得到推广,小程序成为一种重要的 ...
- 微信小程序开发系列五:微信小程序中如何响应用户输入事件
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
随机推荐
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
- CQOI2011分金币&HAOI2008糖果传递
双倍经验…… 没想到白书上竟然有……我还看过……还忘了…… 抄份题解: A1 + X1 - X2 = G A2 + X2 - X3 = G . . . An + Xn - X1 = G 解得 X1 = ...
- C# List 用法与示例
Problem. You have questions about the List collection in the .NET Framework, which is located in the ...
- android ListView注意事项
所有问题,都是自己遇到过的. 但内容,有一半是自己写的,也有一半是复制过来. 所以,写成原创还请原谅 1. ListView添加标题后(addHeader())后,使用listView.getAdap ...
- Gen_fsm行为实践与分析
1.简介 Gen_fsm是一个通用的有限状态机,它描述了这样的一组关系: State(S) x Event(E) -> Actions(A),State(S') 这个关系意味着:如果在S状态下发 ...
- 用JSP做后台管理系统
添加新闻 /** * 获取从页面读取的数据 * @param request * @return 单个新闻信息 * @throws UnsupportedEncodingException ...
- 一些常被你忽略的CSS小知识
1.CSS的color属性并非只能用于文本显示 对于CSS的color属性,相信所有Web开发人员都使用过.如果你并不是一个特别有经 验的程序员,我相信你未必知道color属性除了能用在文本显示,还可 ...
- 给定金额m和红包数量n
这一题如果是采用暴力手段,不一定能获得正确答案,而且也非常耗时. 所以下面我们采用一个小技巧,也就是先产生n-1个红包,总得sum<m的,这样最后只要添加一个sum-m的红包钱数就可以了. 具体 ...
- 609B Load Balancing
题意:有n本书分m个类别,现在你要买两本不属于同一类别的书,问有多少种方案. #include<iostream> #include<cstdlib> #include< ...
- Navicat通过云主机内网连接阿里云RDS
背景 公司为了安全起见,RDS设置只允许阿里云主机的内网端可以访问.这就意味,如果要操作RDS就需要连接到云主机上之后通过mysql shell操作.操作起来很复杂麻烦,今天看同事用Navicat f ...