[Android] SharedPreference

Jay·2021년 1월 16일
0

Android

목록 보기
9/39
post-thumbnail
post-custom-banner

Prolog

Velog를 하는 목적처럼 기존에 알더라도 제대로 잡고 가잔 의미에서 또 정리를 하게 된다. 아무 생각없이 쓰던 기술들에 대해 확실한 정리가 뒷받침되어야 해당 기술을 더 잘 활용하지 않을까...🧐


SharedPreference

🤫 한마디로 요약해보자.

Activity나 Application 설정값이나 UI정보 같은 간단한 정보 값을
XML(Key, Value) 기반의 파일 형태로 저장하고 꺼내 쓸 수 있는 것이다.

  • 간단한 값 저장에 DB 저장은 부담스럽다. 이럴 때 사용한다.
  • 보통 초기 설정 값이나 자동 로그인 여부 등의 간단한 값을 저장한다.
  • Application에 파일 형태로 데이터를 저장한다.
    -> data/data/패키지명/shared_pref/지정한이름.xml
  • Application이 삭제되기 전까지 보존된다.

Instance 얻기

  • getPreference(int mode)
    : 하나의 Activity에서만 사용하는 SharedPreference를 생성한다.
    : 생성되는 SharedPreference 파일은 해당 액티비티 이름으로 생성된다.

  • getSharedPreference(String name, int mode)
    : 특정 이름을 가진 SharedPreference를 생성한다.


데이터 저장하기

데이터 기록을 위해 SharedPrefereces.Editor 인스턴스를 얻어야 한다.

SharedPreference sb = getSharedPreference("android", MODE_PRIVATE);
SharedPreference.Editor editor = sb.edit();
editor.putString("first", infoFirst); //first라는 키값으로 저장
editor.commit();  //완료

저장 가능한 데이터 타입

  • Boolean
  • Integer
  • Float
  • Long
  • String

apply() vs commit()의 차이

데이터를 저장할 때에 있어서 commit()과 apply()가 있다.
둘의 차이는 꽤나 자주나오는 문제인가보다.
(apply()를 IDE에서는 추천한다.)

public abstract boolean commit () -- API 1

public abstract void apply () -- API 9

  • commit()
    - 데이터가 동기적으로 반영된다.

    • 리턴 값이 존재 한다.
    • 메서드를 블럭하고 write하기에 느리다.(상대적으로)
  • apply()
    - 비동기적으로 반영이 된다.

    • 실패 시에 어떠한 알림조차 받을 수 없단 문제는 있다.(리턴값X)
    • 비동기적이기에 빠르다.(상대적으로)

commit() -> apply()는 10~30배가 빨라진다고 하니..


👆 Gson을 이용하여 저장해보자.

참고로 SharedPreference에 데이터를 저장할 때, Gson을 이용하여 객체를 저장할 수도 있다.

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);


Editor prefsEditor = mPrefs.edit();
     Gson gson = new Gson();
     String json = gson.toJson(MyObject);
     prefsEditor.putString("MyObject", json);
     prefsEditor.commit();


Gson gson = new Gson(); 
String json = mPrefs.getString("MyObject", ""); 
MyObject obj = gson.fromJson(json, MyObject.class);

출처 : https://humble.tistory.com/9

profile
developer
post-custom-banner

0개의 댓글