54

だから私はbyte [] array私のアンドロイドアプリで作成したものを持っています。Android の SharedPreferences を使用して保存し、アプリの起動時に再度取得したいと考えています。どうやってやるの ?

4

5 に答える 5

118

android.util.Base64 を使用して、バイト配列を SharedPreferences に保存できます。

保存する場合:

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

読み込みの場合:

byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);
于 2014-02-18T01:39:53.970 に答える
26

データを Base64 文字列に変換すると、実際にはデータのサイズが大きくなります。

Base64 でエンコードされたバイナリ データの最終的なサイズは、元のデータ サイズの 1.37 倍 + 814 バイト (ヘッダーの場合) に等しくなります。

Charsets.ISO_8859_1を使用して SharedPreferences に byte[] を保存する方が高速でメモリ効率が良い

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 はデータを保持します (UTF-8 や UTF-16 とは異なります)
  • たとえば、JSON を使用してこれらのバイトをアプリの外部に転送する場合は、シリアル化する前に byte[] を Base64 に変換する必要があります。
  • JSON は、ISO_8859_1 が使用する奇妙な文字を理解できません。

ヒント:より多くのスペースを節約したい場合(巨大なバイト[]を節約する場合)、任意の形式(ISOまたはBase64)に変換する前にバイト[]を圧縮します

于 2016-12-27T17:40:51.653 に答える
20

あなたはそれを保存しようとすることができますString

配列の保存:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("myByteArray", Arrays.toString(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]);
    }
}
于 2013-10-24T03:57:06.340 に答える
4

Ariel Yust の回答に賛成できませんでしたが、完全に機能しました。

他の回答 (Base64 エンコーダーなど) は、最小 API バージョンでは利用できなかったか、元の値を保持していませんでした (データの暗号化/復号化時に問題になる可能性があります)。

さらに、 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)
}

次に、文字列でそれを呼び出すだけです:

val string = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).getString("string", "") ?: ""
val byteArray = string.toPreservedByteArray
于 2019-04-23T15:15:05.253 に答える
0

共有設定での配列の保存:

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();     
}

共有設定からの配列データの読み込み:

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));
    }
}

上記の 2 つの関数を実装して呼び出します。上記のコードが役立つことを願っています

于 2013-10-24T04:11:24.327 に答える