프로그래밍/안드로이드

SharedPreference를 이용한 데이타 저장 및 애플리케이션간 데이타 공유

Terry Cho 2015. 9. 23. 00:38

SharedPreference를 이용한 데이타 저장 

및 애플리케이션간 데이타 공유


조대협 (http://bcho.tistory.com)



안드로이드에서는 데이타를 저장할때 여러가지 방법을 사용할 수 있다.

대표적인 방법으로는 일반적으로 파일을 생성해서 저장하는 방법, 그리고 안드로이드에 내장된 데이타 베이스인 SQLite 데이타 베이스를 활용하는 방법이외에 SharedPreference라는 클래스를 사용하여 데이타를 저장하는 방법이 있다.


SharedPreference


SharedPreference는 간단하게 Key/Value 형태로 데이타를 저장할 수 있는 데이타 구조로 내부적으로는 XML 파일로 저장이 된다.


사용법이 매우 간단해서 일반적인 설정값이나 세션 정보, 사용자 정보와 같은 값들을 저장하거나 주로 복잡하지 않고 경량의 데이타를 저장하는데 쉽게 사용할 수 있다. 단 해당 정보는 안드로이드 파일 시스템 내에 XML 파일로 접근이 되기 때문에, 보안적으로 안전하지 않을 수 있기 때문에, 노출등을 대비해서 중요한 정보는 저장하지 않거나 또는 최소한의 암호화를 해서 저장하는 게 어떨까 하는 생각이다. 


실제로 사용하는 방법은 Activity나 Service  클래스에서 Context를 가지고 온후, 해당 Context를 통하여 SharedPreference를 생성하여, 데이타를 저장하면 된다.


다음은 SharedPreference를 write 하는 예제이다



    public void writeSharedPreference(View view){


        EditText txtValue = (EditText) findViewById(R.id.txtValue);

        String value = txtValue.getText().toString();



        // 1. get Shared Preference

        SharedPreferences sharedPreference

                = this.getSharedPreferences("MYPREFRENCE", Context.MODE_MULTI_PROCESS | Context.MODE_WORLD_READABLE); 


        // 2. get Editor

        SharedPreferences.Editor editor = sharedPreference.edit();


        // 3. set Key values

        editor.putString("MYKEY",value);

        editor.putString("KEY2", "VALUE2");


        // 4. commit the values

        editor.commit();

    }


먼저 위의 1단계에서 getSharedPreference를 이용하여, 애플리케이션 컨텍스트로부터 SharedPreference를 가지고 온다. 이때 Preference 의 이름을 지정할 수 있는데, 여기서는 “MYPREFRENCE”라는 이름으로 Preference를 생성하였다. 그리고 다음으로는 access mode를 설정하였는데, 이 예제에서 설정한 access mode는 여러 프로세스간 공유가 가능하고, 읽을 수 있는 모드로 설정하였다. (뒤에서 다른 애플리케이션에서 이 Preference를 열기 위해서 권한을 부여하였다)


잠깐 access_mode에 대해서 짚고 넘어가면

보통은 MODE_PRIVATE을 사용하는데, 이 설정은 다른 애플리케이션은 접근이 불가하고, 오직 이 SharedPreference를 만든 애플리케이션만 접근이 가능하게 한다. MODE_WORLD_READABLE은 다른 애플리케이션도 읽기를 허용하는 권한이고, MODE_WORLD_WRITABLE은 다른 애플리케이션도 쓰기를 허용하는 권한이다.

조금더 자세한 권한에 대한 설명은 http://www.tutorialspoint.com/android/android_shared_preferences.htm 를 참고하기 바란다.



애플리케이션을 실행하면 텍스트 문자열을 입력 받아서 SharedPreference를 저장하게된다.

이때 바로 저장하는 것이 아니라 SharedPreference로 부터 Editor라는 객체를 받아온 후, setXXX메서드를 이용하여 데이타를 셋한후, 저장을 할때는 반드시 editor.commit()을 하여 저장한다.


주) 일종의 트렌젝션과 같은 기능을 제공하는데, 추측하건데 동시에 여러 애플리케이션이 접근하거나 여러 쓰레드가 접근할때 데이타가 틀어지는 것을 막기 위해서 단일 트렌젝션의 기능을 제공하는 걸로 이해 된다.




<그림 1. > 문자열을 입력받아 SharedPreference에 저장하는 앱


실제로 저장이 되었는지 확인을 하려면 Android Device Monitor 라는 도구를 이용하여, 파일 시스템을 살펴보면 생성된 SharedPreference 파일을 찾을 수 있다.


파일은 /data/data/PACKAGE_NAME/shared_prefs 에 저장된다.



<그림 2> Android Device Monitor


실제로 파일을 열어보면 다음과 같이 입력한 값이 XML 형태로 저장됨을 확인할 수 있다.



<그림 3> MYPREFRENCE.xml


SharedPreference를 통하여 다른 애플리케이션과 데이타를 공유하기


SharedPreference는 생성할때 다른 애플리케이션의 접근을 허용하여 생성할 경우, 다른 애플리케이션이 그 데이타를 액세스 할 수 있다. 즉 SharedPreference 를 이용해서 애플리케이션간에 데이타를 공유하는 것이 가능하다.


다음은, 타 애플리케이션의 SharedPreference로 부터 데이타를 읽어와서 EditText에 출력하는 예제의 실행예와 코드이다.




    public void readPreference(View view) throws Exception {



        // get Context of other application

        Context otherAppContext = null;

        try{

            otherAppContext =

                    createPackageContext("com.example.terry.sharedpreferencewriter",0);

        }catch(PackageManager.NameNotFoundException e){

            // log

            e.printStackTrace();

            throw e;

        }


        // getting Shared preference from other application

        SharedPreferences pref

                = otherAppContext.getSharedPreferences("MYPREFRENCE", Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);

        String value = pref.getString("MYKEY", "NOTFOUND");


        EditText txtValue = (EditText)findViewById(R.id.txtValue);

        txtValue.setText(value);


    }


먼저 createPcakgeContext라는 메서드를 이용하여 다른 애플리케이션인 “com.example.terry.sharedpreferencewriter” 에 대한 애플리케이션 Context를 읽어온다.

다음으로는 얻어온 Context로 부터 getSharedPreferences 메서드를 읽어온후에, 해당 SharedPreference로 부터 getString 메서드를 이용하여 “MYKEY” 라는 키로 저장된 값을 읽어와서 출력한다.