Android - Preferences (Data의 저장)

Android 2016. 2. 24. 16:16 posted by TechNote.kr


현재 만들어 보고 있는 메모의 Widget을 구현하기 위해 이리저리 코드를 찾아보고 만들어보고 있다. 


각종 참고 Site에 가이드된대로 Widget은 무난히 구현해서 의도대로 홈 화면에 위젯이 표시되는 것까지 확인하였다. 


그런데 분명히 Widget 생성시에는 정상적으로 표시하려는 메모 내용이 보였는데, 어느 순간 보면 해당 내용이 사라지는 현상이 발생하였다. 처음에는 내가 잘못본 것이겠지 했었는데, 현상이 두번이고, 세번이고, 계속 나오는 걸 보니 뭔가 놓친 부분이 있는 것을 알았다.


재현 경로를 확인해 보니 다음과 같다. 

메모의 Widget 생성 (문제 없음) -> 재부팅 -> Widget 확인시 해당 내용 사라짐


 


인터넷을 좀 찾아보니 위와 같은 현상을 해결하는 방법은 다음과 같았다. 


1. Widget 표현시 해당 Data를 파일로 저장하고,

2. 화면 표시시에 저장된 해당 값을 가져와 표시해 준다.

   

위와 같은 경우는 위젯 생성시에만 해당 데이터를 화면에만 뿌려주고 아무데도 저장하지 않아 재부팅 후에는 아무런 데이터를 가져올 수 없어서 발생한 문제였다.


그렇다면 데이터의 저장은 어떻게 하면 될까.


데이터를 저장하는 방법은 2가지가 있다. 

1. Database(sqlite)를 사용한다.

2. Preferences를 사용한다.


우리가 흔히 사용하는 Database에 Query를 날려 Data를 저장하고, 읽어오는 방법을 사용하거나 Preference라고 하는 간단한 key-value 저장 메카니즘을 이용해 저장하고 읽어오는 방법을 사용하는 것이다.


그러면 어떤 경우 Database를 사용하고, 어떤 경우 Preferences를 사용하면 될까?


Database와 Preference의 가장 큰 차이는 Query를 날릴수 있는가 없는가일 것이다.

즉, Query를 날려서 원하는 결과만 뽑아내야하는 경우라면 Database를 사용하면 되고, 아니라면 Preference를 사용하면 된다.


위와 같이 Widget의 경우는 Widget ID에 대한 내용만 보여주면 되는 것이므로 Database를 사용하는 것 보다 Preference를 사용하는 것이 적절한 것으로 판단된다.



그렇다면 Preferences는 어떻게 사용하면 될까?


Preferences의 사용 



Preferences 를 사용한다고하면 보통 SharedPreferences를 사용하게된다.

SharedPreferences는 말그대로 Shared 된 Prefereneces라는 말인데 저장된 Preferences를 외부에서도 접근가능하다고해서 Shared 라는 prefix가 붙게 되었다.


    // 값 Restore

        SharedPreferences pref = getSharedPreferences("FileName", MODE_PRIVATE);

        pref.getString("key", "");

     

    // 값 Save

        SharedPreferences pref = getSharedPreferences("FileName", MODE_PRIVATE);

        SharedPreferences.Editor editor = pref.edit();

        editor.putString("key", "value");

        editor.commit();



위와 같이 코드가 별다르게 없다. 

실제 값을 처음 Set 하는 부분에 Save routine을 추가하고, 화면 표시하는 부분에 Restore routine을 추가하면 된다.


Preferences를 이용하여 Widget 내용을 처리하니 아래와 같이 재부팅을 하여도 정상적으로 Widget 내용이 남아 있음을 확인하였다.