SharedPreferences 저장 및 복원


안드로이드에서 설정을 저장하기 위해서 기본적으로 SharedPreferences를 제공한다. DB만큼은 아니지만 간단한 정보를 저장하기 위한 수단으로 간편하다. 이 데이터는 /data/packagename/shared_prefs/ 내에 xml형태로 저장된다.

SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Editor editor = sharedpreferences.edit();
editor.putString("key", "value");
editor.commit();

/data/에 위치 해있는 파일들은 앱을 지우면 자동으로 지워지게 되는데, 앱의 문제로 앱을 삭제하고 재 설치 하는 경우 설정파일이 모두지워지게 된다. 이런 사용성을 개선하기위해 설정파일을 백업해주는 기능을 지원하면 된다.

/data/는 루팅을 하지 않으면 접근이 불가능하기때문에 xml파일을 가져 올수 없다. 그렇기 때문에 SharedPreferences의 저장된 키를 모두 읽은다음에 xml이나 json처럼 데이터화 시켜서 파일로 저장해야한다.

SharedPreferences 파일로 저장

JSONObject setting = new JSONObject();

Map<String, ?> prefsMap = sharedpreferences.getAll();
for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {

  final String key = entry.getKey();
  final Object value = entry.getValue();

  try {
    setting.putOpt(key, value);
  } catch (JSONException e) {
  }
}

String jsonString = setting.toString();

try {
  File file = new File(new File(Environment.getExternalStorageDirectory(), "/preference") + "/" + SAVE_FILE_NAME);

  FileOutputStream fos = new FileOutputStream(file);
  fos.write(jsonString.getBytes());
  fos.close();

  Toast.makeText(context, "Save Success!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
}

SharedPreferences 파일에서 불러오기

String jsonString = "";

try {
  FileInputStream fis = new FileInputStream(new File(Environment.getExternalStorageDirectory(), "/preference") + "/" + SAVE_FILE_NAME);
  BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fis));
  String temp = "";
  while ((temp = bufferReader.readLine()) != null) {
    jsonString += temp;
  }

  bufferReader.close();
  fis.close();

} catch (Exception e) {
}

if (TextUtils.isEmpty(jsonString)) {
  return;
}

JSONObject setting = null;
try {
  setting = new JSONObject(jsonString);
} catch (JSONException e) {
}

if (setting == null)
return;

Iterator<String> keys = setting.keys();

while (keys.hasNext()) {
  String key = keys.next();

  Object value = setting.opt(key);

  if (value instanceof String) {
    sharedpreferences.getEditor().putString(key, (String) value);
  } else if (value instanceof Boolean) {
    sharedpreferences.getEditor().putBoolean(key, (Boolean) value);
  } else if (value instanceof Integer) {
    sharedpreferences.getEditor().putInt(key, (Integer) value);
  } else if (value instanceof Long) {
    sharedpreferences.getEditor().putLong(key, (Long) value);
  }
}

sharedpreferences.getEditor().commit();
Toast.makeText(context, "Load Success!", Toast.LENGTH_SHORT).show();

SharedPreferences의 getAll()메서드를 이용하여 키를 가져온다음 모든 데이터를 읽어 Json형식으로 만든다음 String으로 파일을 저장한다. 불러 올때는 Json을 읽어 값을 SharedPreferences에 put한다.