Comunidad de diseño web y desarrollo en internet online

Guardar array en Encrypted Local Store

Citar            
MensajeEscrito el 08 Mar 2010 12:22 pm
Saludos a todos!

Veamos, estoy un poco atascada con el almacén local de datos del Flex. Lo he usado otras veces para guardar strings o integers, pero esta vez necesito guardar un array y no consigo que funcione.
Para guardar un array en el almacén hago algo así:

Código ActionScript :

bytes = new ByteArray();
bytes.writeObject(miArray) as Array;
EncryptedLocalStore.setItem("arrayEnAlmacen", bytes);


Y para leerlo:

Código ActionScript :

arrayLeido = EncryptedLocalStore.getItem("arrayEnAlmacen").readObject() as Array;


Todo compila y se ejecuta sin ningún error, se guarda algo en arrayEnAlmacen pero creo que es una referencia nula. Estoy haciendo alguna barbaridad? Se me pasa algo?

Muchas gracias a todos, espero pueda alguien ayudarme :)

Por ChiGaTTa

17 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Mar 2010 08:49 am
Doy un UP :cry: A ver si alguien puede darme alguna pista para resolver esto.


Offtopic: No me había fijado en el flying spaguetti monster :fsm: xDD

Por ChiGaTTa

17 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Mar 2010 12:03 pm
Último intento... UP!

Alguna pista/ayuda? :cry:

Por ChiGaTTa

17 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Mar 2010 08:30 am
no tengo ni idea, pero, en el ejemplo de la ayuda usa un "ByteArray" en lugar de un "Array" (de hecho el método setItem " "pide" como argumento ByteArray)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Mar 2010 08:42 am
Gracias por la respuesta Eliseo2.
El problema es que ya estoy usando ByteArray, si te fijas lo que intento es guardar un Array dentro de ese ByteArray con "writeObject" y lo que introduzco en el EncryptedLocalStore es el ByteArray (con el Array dentro). Esto mismo lo he hecho usando strings e integers y me ha ido bien en cualquier caso. El problema es con los Arrays, que al querer extraerlos parece que pierde la estructura o los tipos que almacenaba y no sabe recuperarlos (o yo soy la que no sé xD, que es más probable).

De momento he optado por guardar lo que me interesaba en un string con separadores para cada string q hubiese metido en el array, algo así:
string1$string2$string3$...$stringN$

El problema es que necesito que el código sea lo más elegante posible, ya que es para mi proyecto de fin de carrera y creo que sería mejor guardarlo en un Array a tener que estar creando y desenredando ese string.

Cualquier ayuda será bienvenida. Un saludo! :)

Por ChiGaTTa

17 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Mar 2010 10:15 am
He hecho un "rápido"

Código ActionScript :

public class Main extends Sprite 
   {
      
      public function Main():void 
      {
         var arrayOrigen:Array = new Array(2, "Hola", "Mundo", { value:3, text:"Texto" } );
         var bytes:ByteArray = new ByteArray();
         bytes.writeObject(arrayOrigen);
         EncryptedLocalStore.setItem("data", bytes);

         var arrayLeido:Array = EncryptedLocalStore.getItem("data").readObject() as Array;
         var texto:TextField = new TextField();
         addChild(texto);
         //texto.text = arrayLeido[1];
         texto.text = arrayLeido.toString();

         EncryptedLocalStore.removeItem("data");
      }
      
   }

Lo que ocurre es que no le veo diferencia con lo que tu tienes. Me veo obligado a preguntar (y lo siento si es estúpida la pregunta) ¿tiene valor "miArray"?

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Mar 2010 10:51 am
Tranquilo, no es una pregunta estúpida, a veces lo más tonto nos lleva de cabeza durante días.
En myArray sí que hay contenido, lo había comprobado ya. También he probado con el código que has puesto tú por lo que pueda ser y me sigue pasando lo mismo. El caso es que no me suelta ningún error, ni de compilación ni nada, pero la ejecución "muere" al llegar a la línea en que leo desde el almacén local. He capturado el error que lo mata y es este:

RangeError: Error #2006: The supplied index is out of bounds.
at flash.utils::ByteArray/readObject()

No sé a qué índice se refiere, siendo que la línea del error es:

Código ActionScript :

var arrayLeido:Array = EncryptedLocalStore.getItem("data").readObject() as Array;


He probado a leer el array una vez se ha escrito en el ByteArray, es decir, algo así:

Código ActionScript :

var arrayOrigen:Array = new Array(2, "Hola", "Mundo", { value:3, text:"Texto" } ); 
var bytes:ByteArray = new ByteArray(); 
bytes.writeObject(arrayOrigen);
try {
    var arrayLeido:Array = bytes.readObject() as Array;
}
catch (error:Error){
    Alert.show(error.getStackTrace());
}


El try/catch es para que me enseñe por qué muere, ya que sino, simplemente se ejecuta hasta donde da el error pero sin avisar de nada. Entonces, probando eso, me sale en el alert:

Error: Error #2030: End of file was encountered.
at flash.utils::ByteArray/readObject()

A ti te funciona el ejemplo que me pusiste? Capaz que me olvido de algo obvio y no caigo xD Muchas gracias por intentar ayudarme

Por ChiGaTTa

17 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Mar 2010 08:12 pm
El ejemplo que puse lo hice con FlashDeveloper y funcionaba (quité del código todos los import).
He hecho un corta y pega

Código ActionScript :

         var arrayOrigen:Array = new Array(2, "Hola", "Mundo", { value:3, text:"Texto" } );
       var bytes:ByteArray = new ByteArray();
       bytes.writeObject(arrayOrigen);
       EncryptedLocalStore.setItem("data", bytes);
       var arrayLeido:Array = EncryptedLocalStore.getItem("data").readObject() as Array;
       var texto:TextField = new TextField();
       addChild(texto);
       //texto.text = arrayLeido[1];
       texto.text = arrayLeido.toString();
       EncryptedLocalStore.removeItem("data"); 

en un fotograma con CS4 -Archivo nuevo de Adobe Air- y también me funciona

También con CS4, le doy como clase de documento "Main" y escribo en main.as ¡¡OJO!! que he cambiado la Clase para que extienda de MovieClip en lugar de de Sprite

Código ActionScript :

package{
   import flash.display.Sprite;
   import flash.display.MovieClip;
   import flash.utils.ByteArray;
   import flash.data.EncryptedLocalStore;
   import flash.text.TextField;
   public class Main extends MovieClip     {
   public function Main():void        {
      var arrayOrigen:Array = new Array(2, "Hola", "Mundo", { value:3, text:"Texto" } );
      var bytes:ByteArray = new ByteArray();
      bytes.writeObject(arrayOrigen);
      EncryptedLocalStore.setItem("data", bytes);
      var arrayLeido:Array = EncryptedLocalStore.getItem("data").readObject() as Array;
      var texto:TextField = new TextField();
      addChild(texto);
      //texto.text = arrayLeido[1];
      texto.text = arrayLeido.toString();
      EncryptedLocalStore.removeItem("data");       
      }
      } 
}

y me funciona igualmente
He comentado la línea

Código ActionScript :

//EncryptedLocalStore.removeItem("data");       

Lo he ejecutado
Ahora he comentado las líneas

Código ActionScript :

//      var arrayOrigen:Array = new Array(2, "Hola", "Mundo", { value:3, text:"Texto" } );
//      var bytes:ByteArray = new ByteArray();
//      bytes.writeObject(arrayOrigen);
//      EncryptedLocalStore.setItem("data", bytes);

y, ejecutándolo me sigue funcionando.

No se me ocurre ninguna prueba más :(
El

Error #2006: The supplied index is out of bounds.
at flash.utils::ByteArray/readObject()

y el que me comentas con el try..catch suena a que NO está grabando.
Se me ocurre a que fuerces el argumento al false en el setItems
o que compruebes la longitud del Bytess Array antes de hacer el setItems

Código ActionScript :

bytes.writeObject(arrayOrigen);
trace(bytes.length); //Comprobamos los bytes que tiene -en mi ejemplo 42
EncryptedLocalStore.setItem("data", bytes,false);  //<--he puesto como tercer argumento "false"

Por Eliseo2

710 de clabLevel



 

msie8
Citar            
MensajeEscrito el 15 Mar 2010 09:25 am
Tuve en cuenta tu idea de que el error debía estar en que no guardaba nada en el ByteArray, y comprobé la longitud. Igual que a ti, me salía 42, es decir, sí que escribía algo. Lo otro que me proponías ya tenía que ver con escribir dentro del almacén, y el error lo tengo antes, en el ByteArray. Puedo escribir en él, pero cuando intento leer lo que contiene me salta el error de "end of file encountered".
He buscado un poco, y efectivamente ese error salta cuando se intenta leer más allá de la longitud del ByteArray, lo que no entiendo es por qué sale.
Si pongo el código en un nuevo proyecto sí que funciona, el problema es cuando intento usarlo en la aplicación que estoy desarrollando y creo que tiene relación con el Merapi.
Merapi es un puente que establece comunicación entre Flex y Java, y me parece que el error viene de por ahí (Merapi está en desarrollo y, por lo tanto, repleto de bugs).
Intentaré aislar el uso de ByteArrays fuera de las clases que establecen la comunicación, a ver si así se soluciona el problema porque sino ya no sé que más probar.

Un saludo, y muchas gracias por tu atención y ayuda ^^

Por ChiGaTTa

17 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.