Reputation: 985
So I have a byte [] array
which I have created in my android app. I want to use SharedPreferences from android to store it and retrieve it back again when I start my app.
How can I do that ?
Upvotes: 60
Views: 29337
Reputation: 11
For Kotlin you can use extension function like:
fun SharedPreferences.getByteArray(key:String): ByteArray{
return Base64.decode(getString(key,""), Base64.DEFAULT)
}
fun SharedPreferences.Editor.putByteArray(key:String,byteArray: ByteArray):SharedPreferences.Editor{
putString(key, Base64.encodeToString(byteArray, Base64.DEFAULT))
return this
}
Upvotes: 0
Reputation: 1090
You could try to save it has a String
:
Storing the array:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("myByteArray", Arrays.toString(array));
Retrieving the array:
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]);
}
}
Upvotes: 22
Reputation: 41
I couldn't upvote Ariel Yust's answer but it worked perfectly.
Other answers (like Base64 encoder) were not available for my minimum API version or did not preserve the original value (that can be problematic when encrypting / decrypting data)
As an addition I advise to use extensions in 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)
}
Then you simply call it on your string :
val string = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).getString("string", "") ?: ""
val byteArray = string.toPreservedByteArray
Upvotes: 4
Reputation: 615
You actually enlarge the size of a data when you convert it to a Base64 String.
the final size of Base64-encoded binary data is equal to 1.37 times the original data size + 814 bytes (for headers).
It's faster and memory efficient to save a byte[] in the SharedPreferences using Charsets.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();
}
TIP : if you want to save on more space (in case your saving huge byte[]) compress the byte[] before you convert it to any format (ISO or Base64)
Upvotes: 32
Reputation: 2314
You can save a byte array in SharedPreferences by using android.util.Base64.
For saving:
String saveThis = Base64.encodeToString(array, Base64.DEFAULT);
For loading:
byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);
Upvotes: 130
Reputation: 3010
Saving an Array in Shared Preferences:
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();
}
Loading Array Data from Shared Preferences:
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));
}
}
Implement and call the above 2 functions. I hope the above code helps
Upvotes: 0