Есть ли способ скопировать или дублировать SharedPreference? Или мне нужно будет получить каждую переменную из одной, а затем поместить их в другую?
Android: копирование/дублирование общих настроек
comment
получить каждую переменную из одной и поместить их в другую - это единственный способ, о котором я знаю. Но SharedPrefs хранятся в виде файла xml, я полагаю, вы могли бы скопировать весь этот файл и каким-то образом вставить его с новым именем. Однако для этого подхода может потребоваться корневое устройство, чтобы иметь возможность устанавливать входные и выходные потоки в папку SharedPreferences ваших приложений.
- person FoamyGuy   schedule 21.09.2011
comment
почему вы хотите скопировать общие настройки? Объясните немного подробнее, чего вы пытаетесь достичь, и это поможет нам дать подходящий ответ.
- person Kenny   schedule 21.09.2011
comment
Мое приложение хранит свои переменные в общем файле. У меня есть около 50 переменных, которые постоянно меняются, другими словами, их нельзя жестко закодировать в приложении. Я хотел бы иметь возможность отложить эти переменные, чтобы пользователь приложения мог начать новый сеанс, а затем переключаться между ними. Полагаю, я мог бы смириться и записать все переменные в другой разделяемый параметр, но было бы намного проще, если бы я мог просто сделать это: saveSharedPreference = sharedPreference. Смешной
- person cerealspiller   schedule 21.09.2011
Ответы (3)
Попробуйте что-то вроде этого:
//sp1 is the shared pref to copy to
SharedPreferences.Editor ed = sp1.edit();
SharedPreferences sp = Sp2; //The shared preferences to copy from
ed.clear(); // This clears the one we are copying to, but you don't necessarily need to do that.
//Cycle through all the entries in the sp
for(Entry<String,?> entry : sp.getAll().entrySet()){
Object v = entry.getValue();
String key = entry.getKey();
//Now we just figure out what type it is, so we can copy it.
// Note that i am using Boolean and Integer instead of boolean and int.
// That's because the Entry class can only hold objects and int and boolean are primatives.
if(v instanceof Boolean)
// Also note that i have to cast the object to a Boolean
// and then use .booleanValue to get the boolean
ed.putBoolean(key, ((Boolean)v).booleanValue());
else if(v instanceof Float)
ed.putFloat(key, ((Float)v).floatValue());
else if(v instanceof Integer)
ed.putInt(key, ((Integer)v).intValue());
else if(v instanceof Long)
ed.putLong(key, ((Long)v).longValue());
else if(v instanceof String)
ed.putString(key, ((String)v));
}
ed.commit(); //save it.
Надеюсь это поможет.
person
zarthross
schedule
05.10.2011
не забудьте принять и/или проголосовать за ответ, если он помог;)
- person zarthross; 09.10.2011
это следует принять как ответ. Также вы можете добавить: /* Пользовательские настройки сохраняются в настройках Activity */ if (SystemUtils.getSDKVersion() › Build.VERSION_CODES.FROYO) { editor.apply(); } иначе { editor.commit(); }
- person Andrew Mackenzie; 05.06.2013
Версия Котлина:
fun SharedPreferences.copyTo(dest: SharedPreferences) = with(dest.edit()) {
for (entry in all.entries) {
val value = entry.value ?: continue
val key = entry.key
when (value) {
is String -> putString(key, value)
is Set<*> -> putStringSet(key, value as Set<String>)
is Int -> putInt(key, value)
is Long -> putLong(key, value)
is Float -> putFloat(key, value)
is Boolean -> putBoolean(key, value)
else -> error("Unknown value type: $value")
}
}
apply()
}
Использование:
val prefs1 = getSharedPreferences("test1", MODE_PRIVATE)
val prefs2 = getSharedPreferences("test2", MODE_PRIVATE)
prefs1.copyTo(prefs2)
person
afollestad
schedule
27.09.2018
Вот версия, которая также поддерживает наборы строк.
public static void copySharedPreferences(SharedPreferences fromPreferences, SharedPreferences toPreferences) {
copySharedPreferences(fromPreferences, toPreferences, true);
}
public static void copySharedPreferences(SharedPreferences fromPreferences, SharedPreferences toPreferences, boolean clear) {
SharedPreferences.Editor editor = toPreferences.edit();
if (clear) {
editor.clear();
}
copySharedPreferences(fromPreferences, editor);
editor.commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressWarnings({"unchecked", "ConstantConditions"})
public static void copySharedPreferences(SharedPreferences fromPreferences, SharedPreferences.Editor toEditor) {
for (Map.Entry<String, ?> entry : fromPreferences.getAll().entrySet()) {
Object value = entry.getValue();
String key = entry.getKey();
if (value instanceof String) {
toEditor.putString(key, ((String) value));
} else if (value instanceof Set) {
toEditor.putStringSet(key, (Set<String>) value); // EditorImpl.putStringSet already creates a copy of the set
} else if (value instanceof Integer) {
toEditor.putInt(key, (Integer) value);
} else if (value instanceof Long) {
toEditor.putLong(key, (Long) value);
} else if (value instanceof Float) {
toEditor.putFloat(key, (Float) value);
} else if (value instanceof Boolean) {
toEditor.putBoolean(key, (Boolean) value);
}
}
}
person
Oliver Jonas
schedule
02.05.2014