SharedPreferences의 모범 사례

Best practices for SharedPreferences
Android는 애플리케이션 데이터를 저장하는 여러 가지 방법을 제공합니다.그 중 하나는 Shared Preferences 대상으로 개인 키 값 (key-value) 데이터를 저장하는 것입니다.
모든 논리는 다음 세 가지 클래스를 기반으로 합니다.
  • SharedPreferences
  • SharedPreferences.Editor
  • SharedPreferences.OnSharedPreferenceChangeListener

  • SharedPreferences
    Shared Preferences가 가장 중요합니다.Editor 대상을 가져오는 인터페이스와 OnSharedPreferenceChangeListener를 추가하거나 제거하는 인터페이스를 제공합니다.
  • SharedPreferences를 만들려면 Context 대상이 필요합니다. (application Context일 수도 있습니다.)
  • getsharedPreferences 방법은Preference 파일을 분석하고 맵 대상을 만듭니다
  • Context에서 제공하는 몇 가지 모드로 만들 수 있습니다. MODE 를 강력히 권장합니다.PRIVATE 모드는 전체적으로 읽을 수 있고 쓸 수 있는 파일을 만드는 것이 위험하기 때문에 app의 안전 결함을 초래할 수 있습니다.
    / parse Preference file   Preference  
    SharedPreferences preferences = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    
    // get values from Map
    preferences.getBoolean("key", defaultValue)  
    preferences.get..("key", defaultValue)
    
    // you can get all Map but be careful you must not modify the collection returned by this
    // method, or alter any of its contents.
    //(Preference     map)        map           map     
    Map<String, ?> all = preferences.getAll();
    
    // get Editor object
    SharedPreferences.Editor editor = preferences.edit();
    
    //add on Change Listener      
    preferences.registerOnSharedPreferenceChangeListener(mListener);
    
    //remove on Change Listener      
    preferences.unregisterOnSharedPreferenceChangeListener(mListener);
    
    // listener example      
    SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener  
            = new SharedPreferences.OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        }
    };
    

  • Editor
    SharedPreferences.Editor는 SharedPreferences 객체 값을 수정하는 인터페이스입니다.Editor의 변경 사항은 일괄 처리되며,commit () 또는 apply () 를 호출했을 때만 원래의sharedPreferences로 복사됩니다.
  • Editor를 사용한 단순 인터페이스 추가 값
  • 동기화된commit()이나 속도가 더 빠르고 다른 apply()로 값을 저장합니다.실제로 서로 다른 라인에서commit()를 사용할 때 더욱 안전합니다.이것은 왜 나는commit()
  • 을 즐겨 쓰는가
  • 단일 값 삭제는remove, 모든 값 삭제는clear()
    // get Editor object
    SharedPreferences.Editor editor = preferences.edit();
    
    // put values in editor
    editor.putBoolean("key", value);  
    editor.put..("key", value);
    
    // remove single value by key
    editor.remove("key");
    
    // remove all values
    editor.clear();
    
    // commit your putted values to the SharedPreferences object synchronously
    // returns true if success            true
    boolean result = editor.commit();
    
    // do the same as commit() but asynchronously (faster but not safely)
    // returns nothing           
    editor.apply();
    
  • 성능 및 기술
  • SharedPreferences는 단일 대상이기 때문에 여러 인용을 쉽게 얻을 수 있습니다. getsharedPreferences를 처음 호출할 때만 파일을 열고 인용만 만들 수 있습니다.(ps: 잔소리, 사실은 한 번만 실례화하면 뒤에 호출이 점점 빨라진다. 아래의 예를 보자)
    // There are 1000 String values in preferences
    
    SharedPreferences first = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);  
    // call time = 4 milliseconds         4  
    
    SharedPreferences second = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);  
    // call time = 0 milliseconds   0
    
    SharedPreferences third = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);  
    // call time = 0 milliseconds   0
    
  • 단일 대상이기 때문에 여러 실례의 내용을 마음대로 변경할 수 있습니다. 그들의 데이터가 다를 염려가 없습니다
    first.edit().putInt("key",15).commit();
    
    int firstValue = first.getInt("key",0)); // firstValue is 15  
    int secondValue = second.getInt("key",0)); // secondValue is also 15
    
  • get 방법을 처음 호출할 때 키 해석을 통해value를 가져와 맵에 추가합니다. 두 번째 호출 get은 맵에서 직접 꺼냅니다. 해석하지 않아도 됩니다.
    first.getString("key", null)  
    // call time = 147 milliseconds            ,     map 
    
    first.getString("key", null)  
    // call time = 0 milliseconds       map   ,       
    
    second.getString("key", null)  
    // call time = 0 milliseconds       
    
    third.getString("key", null)  
    // call time = 0 milliseconds
    
  • 큰 Preference 대상일수록 get,commit,apply,remove와clear 등의 조작 시간이 길어진다는 것을 기억한다.그래서 당신의 데이터를 다른 작은 대상으로 나누는 것을 추천합니다.
  • 당신의 Preference는 앱이 업데이트된 후에 제거되지 않기 때문에 때때로 이전 방안을 만들어야 합니다.예를 들어 당신의 앱은 시작할 때 로컬 JSON을 분석해야 합니다. 첫 번째 실행을 시작한 후에boolean의 표지인wasLocal DataLoaded를 저장해야 합니다. 한동안 JSON이 업데이트되어 새로운 버전을 발표했습니다. 사용자는 앱을 업데이트하지만 새로운 JSON을 불러오지 않습니다. 왜냐하면 첫 번째 버전에서 이미 만들었기 때문입니다.
    public class MigrationManager {  
        private final static String KEY_PREFERENCES_VERSION = "key_preferences_version";
        private final static int PREFERENCES_VERSION = 2;
    
        public static void migrate(Context context) {
            SharedPreferences preferences = context.getSharedPreferences("pref", Context.MODE_PRIVATE);
            checkPreferences(preferences);
        }
    
        private static void checkPreferences(SharedPreferences thePreferences) {
            final double oldVersion = thePreferences.getInt(KEY_PREFERENCES_VERSION, 1);
    
            if (oldVersion < PREFERENCES_VERSION) {
                final SharedPreferences.Editor edit = thePreferences.edit();
                edit.clear();
                edit.putInt(KEY_PREFERENCES_VERSION, currentVersion);
                edit.commit();
            }
        }
    }
    
  • SharedPreferences는 app의 데이터 폴더에 저장된 xml 파일
    // yours preferences        
    /data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml
    
    // default preferences   
    /data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences.xml
    
  • 예제 코드
        public class PreferencesManager {
    
            private static final String PREF_NAME = "com.example.app.PREF_NAME";
            private static final String KEY_VALUE = "com.example.app.KEY_VALUE";
    
            private static PreferencesManager sInstance;
            private final SharedPreferences mPref;
    
            private PreferencesManager(Context context) {
                mPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
            }
    
            public static synchronized void initializeInstance(Context context) {
                if (sInstance == null) {
                    sInstance = new PreferencesManager(context);
                }
            }
    
            public static synchronized PreferencesManager getInstance() {
                if (sInstance == null) {
                    throw new IllegalStateException(PreferencesManager.class.getSimpleName() +
                            " is not initialized, call initializeInstance(..) method first.");
                }
                return sInstance;
            }
    
            public void setValue(long value) {
                mPref.edit()
                        .putLong(KEY_VALUE, value)
                        .commit();
            }
    
            public long getValue() {
                return mPref.getLong(KEY_VALUE, 0);
            }
    
            public void remove(String key) {
                mPref.edit()
                        .remove(key)
                        .commit();
            }
    
            public boolean clear() {
                return mPref.edit()
                        .clear()
                        .commit();
            }
        }
    

    좋은 웹페이지 즐겨찾기