Así que tengo un byte [] array que he creado en mi android. Quiero usar SharedPreferences de android para almacenar y recuperar de nuevo cuando inicio mi aplicación.
¿Cómo puedo hacer eso ?

  • ¿Has probado algo ?
InformationsquelleAutor user2453055 | 2013-10-24

5 Comentarios

  1. 21

    Usted podría tratar de guardar tiene un String:

    Storring la matriz:

    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("myByteArray", Arrays.toString(array));

    La recuperación de la matriz:

    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String stringArray = settings.getString("myByteArray", null);
    
    if (stringArray != null) {
        String[] split = stringArray.substring(1, stringArray.length()-1).split(", ");
        byte[] array = new byte[split.length];
        for (int i = 0; i < split.length; i++) {
          array[i] = Byte.parseByte(split[i]);
        }
    }
    • No de trabajo. También ¿por qué lo hiciste ‘String[] split = stringArray.substring(1, stringArray.length()-1).split(«, «);’ ?
    • Puedes dar más detalles del por qué no funciona? El código de las pruebas de multa a mi lado. Como para la subcadena, se hace debido a que cuando llame Arrays.toString(array), crea una String de la forma «[1, 2, 3, 4]». Así que el substring() es quitar los corchetes y el split() es obtener una matriz de cadenas que contiene los números individuales de modo que podemos analizar con facilidad en bytes.
    • Cuando estoy ahorrando byte[] de una imagen y después de algún tiempo quiero recuperar de sharedPreferences se congela la aplicación de 5 a 15 o 20 segundos que se basa en el tamaño de la imagen. Si es grande la imagen, de lo que se lleva entre 25 y 30 segundos)) Así que creo que la mejor forma es guardar en archivo)
    • SharedPreferences no está pensado para la gran cantidad de datos, está respaldada por un simple archivo xml en el sistema de archivos. También, si su aplicación es la congelación, puede ser porque se está ejecutando la operación en la interfaz principal del hilo?
  2. 95

    Puede guardar una matriz de bytes en SharedPreferences por el uso de android.util.Base64.

    Para el ahorro:

    String saveThis = Base64.encodeToString(array, Base64.DEFAULT);

    Para la carga:

    byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);
    • Gran copy&pasado solución, sin embargo yo uso Base64.NO_WRAP en lugar de Base64.DEFAULT en mi humilde opinión no hay razón para el uso de los saltos de línea en las preferencias.
  3. 15

    Realmente agrandar el tamaño de los datos cuando se convierte en una Cadena Base64.

    el tamaño final de Base64 codificado en binario de datos es igual a 1,37 veces el tamaño original de los datos + 814 bytes (para los encabezados).

    Es más rápido y eficiente de la memoria para guardar un byte[] en el SharedPreferences utilizando Los conjuntos de caracteres.ISO_8859_1

    private static final String PREF_NAME = "SharedPreferences_Name";
    private static final String DATA_NAME = "BytesData_Name";
    
    public static byte[] getBytes(Context ctx) {
        SharedPreferences prefs = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        String str = prefs.getString(DATA_NAME, null);
        if (str != null) {
            return str.getBytes(Charsets.ISO_8859_1);
        }
        return null;
    }
    
    public static void setBytes(Context ctx, byte[] bytes) {
        SharedPreferences prefs = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor e = prefs.edit();
        e.putString(DATA_NAME, new String(bytes, Charsets.ISO_8859_1));
        e.commit();
    }
    • ISO_8859_1 Conserva sus datos (a diferencia de la codificación UTF-8 y UTF-16)
    • Si va a transferir estos bytes fuera de la aplicación, el uso de un JSON, por ejemplo, entonces usted tendrá que convertir el byte[] para Base64 antes de la serialización de ellos.
    • JSON no ser capaz de entender los caracteres extraños ISO_8859_1 va a utilizar.

    PUNTA : si desea ahorrar más espacio (en caso de que su ahorro enorme byte[]) comprimir el byte[] antes de convertirlo a cualquier formato (ISO
    o Base64)

    • Si su matriz es enorme, usted no debería estar usando SharedPreferences. Desde Ahorro de Clave-Valor Conjuntos: «Si tienes un relativamente pequeño colección de pares clave-valor que le gustaría ahorrar, usted debe utilizar el SharedPreferences Api.»
    • Es el comportamiento que ISO_8859_1 8 bits en Android documentado en ninguna parte?
    • He incluido un enlace al respecto, y se implementa el código que funciona en Android y iOS combo para una compañía médica – probado y funciona, intente ur self 🙂
  4. 0

    Guardar una colección Compartida de Preferencias:

    public static boolean saveArray()
    {
        SharedPreferences sp = SharedPreferences.getDefaultSharedPreferences(this);
        SharedPreferences.Editor mEdit1 = sp.edit();
        mEdit1.putInt("Status_size", byteArr.size()); /* byteArr is an array */ 
    
        for(int i=0;i<byteArr.size();i++)  
        {
            mEdit1.remove("Status_" + i);
            mEdit1.putString("Status_" + i, byteArr.get(i));  
        }
    
        return mEdit1.commit();     
    }

    De carga de la Matriz de Datos Compartidas de sus Preferencias:

    public static void loadArray(Context mContext)
    {  
        Shared Preferences mSharedPreference1 = PreferenceManager.getDefaultSharedPreferences(mContext);
        byteArr.clear();
        int size = mSharedPreference1.getInt("Status_size", 0);  
    
        for(int i=0;i<size;i++) 
        {
            byteArr.add(mSharedPreference1.getString("Status_" + i, null));
        }
    }

    Implementar y llame a el por encima de 2 funciones. Espero que el código anterior ayuda a

    • Ayudar código completo , pero usted debe explicar más.
  5. 0

    No podía upvote Ariel Yust la respuesta pero funcionó perfectamente.

    Otras respuestas (como Base64 encoder) no estaban disponibles para mi mínimo versión de la API o no preservar el valor original (que puede ser problemático cuando el cifrado /descifrado de datos)

    Como una adición recomendamos el uso de extensiones en kotlin :

    val String.toPreservedByteArray: ByteArray
    get() {
        return this.toByteArray(Charsets.ISO_8859_1)
    }
    
    val ByteArray.toPreservedString: String
    get() {
        return String(this, Charsets.ISO_8859_1)
    }

    A continuación, sólo tiene que llamar en su cadena :

    val string = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).getString("string", "") ?: ""
    val byteArray = string.toPreservedByteArray

Dejar respuesta

Please enter your comment!
Please enter your name here