ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] SharedPreferences 사용하기
    프로그래밍/Android 2019. 1. 4. 13:37

    이래저래 바쁘다는 핑계로 미루다가 오랜만에 포스팅을 하게 되었습니다.

    벌써 새해가 밝았네요. 저만 시간이 빨리 가는 것처럼 느껴지는 건 아니겠죠?

    모두 새해에는 좋은 일이 생겼으면 좋겠습니다.




    SharedPreferences?

    개발을 진행하다 보면, 앱의 데이터들을 저장하여 관리해야 할 상황에 직면하게 되는데요. 데이터의 양이 많거나 중요한 데이터라면 서버나 DB, 파일의 형태로 저장을 하면 되겠지만, 간단한 설정 값이나 문자열 같은 데이터들은 DB에 저장하기에는 부담스럽고 애매한 경우가 있습니다. 이런 경우 안드로이드에서 기본적으로 제공되는 SharedPreferences를 사용하여 데이터를 관리한다면 좀 더 편리하게 사용이 가능합니다.


    SharedPreferences는 데이터를 파일로 저장을 하는데요, 파일이 앱 폴더 내에 저장되므로 앱을 삭제하시면 당연히 데이터도 삭제됩니다.

    자세한 파일의 위치는 아래와 같습니다.


    data/data/(package_name)/shared_prefs/SharedPreference



    SharedPreferences 클래스 작성하기

    SharedPreferences는 데이터를 타입(String, int, .. 등)에 따라 관리하기 때문에 따로 클래스로 만들어서 사용하시면 편리합니다. 한번 만들어 두면 다른 프로젝트에 그대로 복사해서 사용이 가능하기도 합니다.


    PreferenceManager.java



    package rebuild.com.sharedpreferences;


    import android.content.Context;

    import android.content.SharedPreferences;


    /**

     * 데이터 저장 및 로드 클래스

     */

    public class PreferenceManager {

        public static final String PREFERENCES_NAME = "rebuild_preference";


        private static final String DEFAULT_VALUE_STRING = "";

        private static final boolean DEFAULT_VALUE_BOOLEAN = false;

        private static final int DEFAULT_VALUE_INT = -1;

        private static final long DEFAULT_VALUE_LONG = -1L;

        private static final float DEFAULT_VALUE_FLOAT = -1F;


        private static SharedPreferences getPreferences(Context context) {

            return context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);

        }


        /**

         * String 값 저장

         * @param context

         * @param key

         * @param value

         */

        public static void setString(Context context, String key, String value) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor editor = prefs.edit();

            editor.putString(key, value);

            editor.commit();

        }


        /**

         * boolean 값 저장

         * @param context

         * @param key

         * @param value

         */

        public static void setBoolean(Context context, String key, boolean value) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor editor = prefs.edit();

            editor.putBoolean(key, value);

            editor.commit();

        }


        /**

         * int 값 저장

         * @param context

         * @param key

         * @param value

         */

        public static void setInt(Context context, String key, int value) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor editor = prefs.edit();

            editor.putInt(key, value);

            editor.commit();

        }


        /**

         * long 값 저장

         * @param context

         * @param key

         * @param value

         */

        public static void setLong(Context context, String key, long value) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor editor = prefs.edit();

            editor.putLong(key, value);

            editor.commit();

        }


        /**

         * float 값 저장

         * @param context

         * @param key

         * @param value

         */

        public static void setFloat(Context context, String key, float value) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor editor = prefs.edit();

            editor.putFloat(key, value);

            editor.commit();

        }


        /**

         * String 값 로드

         * @param context

         * @param key

         * @return

         */

        public static String getString(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            String value = prefs.getString(key, DEFAULT_VALUE_STRING);

            return value;

        }


        /**

         * boolean 값 로드

         * @param context

         * @param key

         * @return

         */

        public static boolean getBoolean(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            boolean value = prefs.getBoolean(key, DEFAULT_VALUE_BOOLEAN);

            return value;

        }


        /**

         * int 값 로드

         * @param context

         * @param key

         * @return

         */

        public static int getInt(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            int value = prefs.getInt(key, DEFAULT_VALUE_INT);

            return value;

        }


        /**

         * long 값 로드

         * @param context

         * @param key

         * @return

         */

        public static long getLong(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            long value = prefs.getLong(key, DEFAULT_VALUE_LONG);

            return value;

        }


        /**

         * float 값 로드

         * @param context

         * @param key

         * @return

         */

        public static float getFloat(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            float value = prefs.getFloat(key, DEFAULT_VALUE_FLOAT);

            return value;

        }


        /**

         * 키 값 삭제

         * @param context

         * @param key

         */

        public static void removeKey(Context context, String key) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor edit = prefs.edit();

            edit.remove(key);

            edit.commit();

        }


        /**

         * 모든 저장 데이터 삭제

         * @param context

         */

        public static void clear(Context context) {

            SharedPreferences prefs = getPreferences(context);

            SharedPreferences.Editor edit = prefs.edit();

            edit.clear();

            edit.commit();

        }

    }


    간단하게 설명을 하자면,


    데이터를 저장 할 때는 SharedPreferences의 Editor를 이용하여, 데이터 타입에 따라 put을 해주시면 됩니다. 마지막에 commit을 해야 적용되니 주의하시기 바랍니다.

    데이터를 로드 할 때는 저장할 때 사용했던 key 값을 이용하시면 됩니다. 로드 할 때, 해당 key에 해당되는 데이터가 없다면 default로 설정한 값이 호출됩니다.


    그럼 실제 Activity에서 어떻게 사용하는지 예제를 통해 살펴보도록 하겠습니다.



    SharedPreferences 사용하기

    간단하게 저장 된 데이터를 불러와 표시 할 TextView 하나만 배치하겠습니다.


    activity_main.xml



    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:app="http://schemas.android.com/apk/res-auto"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:gravity="center"

        tools:context="rebuild.com.sharedpreferences.MainActivity">


        <TextView

            android:id="@+id/txt_preferences"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textSize="30dp" />


    </LinearLayout>


    이어, Activity를 작성하도록 하겠습니다.


    MainActivity.java



    package rebuild.com.sharedpreferences;


    import android.content.Context;

    import android.os.Bundle;

    import android.support.v7.app.AppCompatActivity;

    import android.widget.TextView;


    public class MainActivity extends AppCompatActivity {

        private Context mContext;


        private TextView txt_preferences;


        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            mContext = this;


            String text = PreferenceManager.getString(mContext, "rebuild");

            if (text.equals("")) {

                text = "저장된 데이터가 없습니다.";

                PreferenceManager.setString(mContext, "rebuild", "숲속의 작은 이야기");

            }


            txt_preferences = (TextView) findViewById(R.id.txt_preferences);

            txt_preferences.setText(text);

        }

    }


    작성한 클래스를 이용해서 "rebuild"라는 key로 저장 된 데이터를 가져옵니다. 만약 가져온 데이터가 default 값이라면 데이터를 저장하도록 구성하였습니다.


    최초 실행했을 때는 데이터가 없어 따로 지정한 text가 보여지겠지만, 앱을 재시작 할 경우, 저장된 값을 불러와 보여지게 되겠죠?.

    결과 확인해 보겠습니다.



      

    실행결과

    좌 - 최초 실행 시 / 우 - 재 시작 시



    이상으로 포스팅을 마치도록 하겠습니다.



    새해에 정했던 목표들은 아직 잘 지켜나가고 계신가요? 사람이 참 부지런하기가 힘이 드네요.

    새해가 되었다고 사람이 한 순간에 부지런히 변신하는 건 아니지만 자꾸 하려고 하면 조금씩이라도 달라지지 않을까요?... 제발....







Designed by Tistory.