Til FLASH :
For at gemme data lokalt med flash, kan du bruge en af 3 måder:Flash Player-cachen, en SharedObject , eller en FileReference objekt. Og for din lokale fil, glem PHP og MySQL, fordi vi kun taler om de data, du har (json, xml, txt, ...).
- Flash Player-cache:
Du skal vide, at flash player som standard lægger en lokal kopi af din fil i sin cache. Du kan bruge denne lokale kopi som en offlinekilde til dine data, men glem ikke, at flash player ikke gemte den sidste version af din fjernfil, men den første, og at http://www.example.com/data.php er forskellig fra http://www.example.com/data.php?123 selvom det er den samme fil! For flere detaljer om det, tag et kig på mit svar på dette spørgsmål .
- SharedObject :
Jeg kender ikke størrelsen på dine indlæste data, men som Adobe sagde om SharedObject:
Jeg tror, det ikke bruges til store filer, og det anbefales ikke at gemme filer, men nogle simple data. Som en cookie til browseren skal SharedOject selvfølgelig bruge brugerens tilladelse til at skrive data til harddisken, og brugeren kan slette dem til enhver tid.
- FileReference:
Jeg tror, det er den bedste måde at gøre det, du leder efter. Du skal vide, at for at gemme en fil ved hjælp af FileReference, bliver din bruger inviteret til at vælge en fil til at gemme data og læse den om en anden gang. Så hvis du ikke ønsker nogen brugers interaktion med din applikation, så glem denne måde.
FileReference ved hjælp af eksempel:
var local_file_name:String = 'local.data',
file:FileReference = new FileReference(),
local_file_filter:FileFilter = new FileFilter('local data file', '*.data'),
remote_data_url:String = 'http://www.example.com/data.php',
url_request:URLRequest,
url_loader:URLLoader,
connected:Boolean = true;
if(connected){
get_remote_data();
} else {
get_local_data();
}
function get_remote_data(): void {
//we use a param to be sure that we have always the last version of our file
url_request = new URLRequest(remote_data_url + ('?' + new Date().getTime()));
url_loader = new URLLoader();
url_loader.addEventListener(Event.COMPLETE, on_data_loaded);
url_loader.load(url_request);
}
function get_local_data(): void {
// show the select dialog to the user to select the local data file
file.browse([local_file_filter]);
file.addEventListener(Event.SELECT, on_file_selected);
}
function on_data_loaded(e:Event): void {
var data:String = e.target.data;
// if the remote data is successfully loaded, save it on a local file
if(connected){
// show the save dialog and save data to a local file
file.save(data, local_file_name);
}
// use your loaded data
trace(data);
}
function on_file_selected(e:Event): void {
file.addEventListener(Event.COMPLETE, on_data_loaded);
file.load();
}
Denne kode vil vise hver gang en gem-dialog til brugeren, selvfølgelig, det er bare et eksempel, du skal tilpasse det til dine behov ...
REDIGER
For AIR:
Med AIR har vi ikke brug for et FileReference-objekt, i stedet bruger vi Fil og en FileStream objekt for at gemme data :
// for example, our local file will be saved in the same dir of our AIR app
var file:File = new File( File.applicationDirectory.resolvePath('local.data').nativePath ),
remote_data_url:String = 'http://www.example.com/data.php',
data_url:String = remote_data_url,
url_request:URLRequest,
url_loader:URLLoader,
connected:Boolean = true;
if(!connected){
// if we are not connected, we use the path of the local file
data_url = file.nativePath;
}
load_data();
function load_data(): void {
url_request = new URLRequest(data_url);
url_loader = new URLLoader();
url_loader.addEventListener(Event.COMPLETE, on_data_loaded);
url_loader.load(url_request);
}
function on_data_loaded(e:Event): void {
var data:String = e.target.data;
if(connected){
// save data to the local file
var file_stream:FileStream = new FileStream();
file_stream.open(file, FileMode.WRITE);
file_stream.writeUTFBytes(data);
file_stream.close();
}
trace(data);
}
Håber det kan hjælpe.