Как перенести файл sharedpreferences из внутреннего хранилища во внешнее хранилище?

Как копировать sharedpreferences на внешнее хранение xml format, так что позже можно будет поделиться настройками.

Пытался читать sharedpreferences и сохранить как string в файл, созданный JSON тип string, но мне нужна xml, Мысль о том, чтобы пройти через внутреннее хранилище приложения и скопировать файл и поместить его во внешнее хранилище, но это может быть слишком сложным.

Просто очень хотелось бы знать, есть ли простой и разумный способ передачи `sharedpreferences.

1 ответ

Решение

Используйте этот код,

SharedPreferences preferences=this.getSharedPreferences("com.example.application", Context.MODE_PRIVATE);
Map<String,?> keys = preferences.getAll();
Properties properties = new Properties();
for(Map.Entry<String,?> entry : keys.entrySet()){
    String key = entry.getKey();
    String value = entry.getValue().toString();
    properties.setProperty(key, value);      
}
try {
    File file = new File("externalPreferences.xml");
    FileOutputStream fileOut = new FileOutputStream(file);
    properties.storeToXML(fileOut, "External Preferences");
    fileOut.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

и чтобы извлечь это,

try {
    File file = new File("externalPreferences.xml");
    FileInputStream fileInput = new FileInputStream(file);
    Properties properties = new Properties();
    properties.loadFromXML(fileInput);
    fileInput.close();

    Enumeration enuKeys = properties.keys();
    SharedPreferences.Editor editor = preferences.edit();
    while (enuKeys.hasMoreElements()) {
        String key = (String) enuKeys.nextElement();
        String value = properties.getProperty(key);
        editor.putString(key, value);
        editor.commit();
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

ПРИМЕЧАНИЕ С этим кодом вы можете обрабатывать только настройки типа String,

Для загрузки общих предпочтений из файла попробуйте это


private fun loadSharedPreferences(src: File, sharedPreferences : SharedPreferences) {
    try{
      var fileInput : FileInputStream = FileInputStream(src)
      val properties : Properties = Properties()
      properties.loadFromXML(fileInput)
      fileInput.close()
      val enuKeys = properties.keys()
      val editor = sharedPreferences.edit()
      while (enuKeys.hasMoreElements()){
        var key = enuKeys.nextElement() as String
        var value = properties.getProperty(key)
        when {
          key.contains("string",true) -> {    //in my case the key of a String contain "string"
            editor.putString(key, value)
          }
          key.contains("int", true) -> {    //in my case the key of a Int contain "int"
            editor.putInt(key, value.toInt())
          }
          key.contains("boolean", true) -> {  // //in my case the key of a Boolean contain "boolean"
            editor.putBoolean(key, value.toBoolean())
          }
        }

        editor.apply();
      }
    }catch ( e : FileNotFoundException) {
      e.printStackTrace();
    } catch ( e : IOException) {
      e.printStackTrace();
    }

  }

Другие вопросы по тегам