SharedPreferent 객체를 초기화하고 편집하는 방법을 알고, 데이터 저장 타임에 대한 몇 가지 일반적인 사례에 대해 생각해보는
것이 중요하다. 다음은 애플리케이션에서 저장 용도로 자주 사용하는 작은 기본형 키/값 데이터 쌍을 설명하는 몇가지 예제다.
사용자 애플리케이션의 첫 방문 체크
다수의 애플리케이션은 사용자가 처음 방문한 경우 지시 사항이나 튜토리얼 또는스플래시 스크린 액티비티를 보여주고 싶을 것이다.
public class SharedPreferencesExample2 extends Activity {
private static final String MY_DB = "my_db";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences sp = getSharedPreferences(MY_DB, Context.MODE_PRIVATE);
/**
* 사용자의 첫 방문인지 체크한다.
*/
boolean hasVisited = sp.getBoolean("hasVisited", false);
if (!hasVisited) {
// ...
// 스플래시 액티비티와 로그인 액티비티 등을 보여준다.
// ...
// 변경을 적용하는 것을 잊지 말자!
Editor e = sp.edit();
e.putBoolean("hasVisited", true);
e.commit();
}
}
}
애플리케이션의 마지막 업데이트 시점 확인
많은 애플리케이션은 캐시나 싱크 혹은 정규 업데이트를 필요로 하는 내장 기능을 갖고 있을 것이다. 마지막 업데이트 시간을 저장하기 위해 얼마나 시간이
지났는지 신속하게 확인할 수 있으며, 업데이트나 싱크가 필요한지를 판단할 수 있다.
/**
* 마지막 업데이트 시간 확인
*/
long lastVisitTime = sp.getLong("lastVisitKey", 0L);
long timeElapsed = System.currentTimeMillis() - lastVisitTime;
// 업데이트 주기
final long UPDATE_FREQ = 1000 * 60 * 60 * 24;
if (timeElapsed > UPDATE_FREQ) {
// ...
// 필요한 업데이트 수행
// ...
}
// 최근 업데이트 시간 저장
Editor e = sp.edit();
e.putLong("lastVisitKey", System.currentTimeMillis());
e.commit();
사용자의 로그인 사용자 이름 저장
많은 애플리케이션은 사용자가 자신의 사용자 이름(추가적으로 PIN과 전화번호 등 기타 로그인 관련 필드)을 기억하게 허용하며, SharedPreference는
단순한 기본형 문자열 ID를 저장하기 위한 강력한 방법이다.
/**
* 사용자 이름을 문자열로 캐시한다.
*/
// 일반적으로 사용자가 자신의 이름을 입력할 수 있는 EDIT TEXT VIEW를 가진다.
EditText userNameLoginText = (EditText) findViewById(R.id.login_editText);
String userName = userNameLoginText.getText().toString();
Editor e1 = sp.edit();
e1.putString("userNameCache", userName);
e1.commit();
애플리케이션의 상태 저장
다수의 애플리케이션에 있어 애플리케이션의 기능은 일반적으로 사용자에 의해 설정된 애플리케이션의 상태에 따라 변경된다. 전화 수신 애플리케이션을
생각해보자. 사용자 전화기가 무음 모드일 때는 어떤 기능도 동작되지 않게 해야 한다면 이는 기억해야 할 중요한 상태일 것이다.
/**
* 특정 상태 저장
*/
boolean isSilentMode = sp.getBoolean("isSilentRinger", false);
if (isSilentMode) {
// ...
// 사운드 끄기
// ...
}
사용자 위치 캐시
모든 위치 기반 애플리케이션은 여러가지 이유(아마도 사용자가 GPS를 껏거나 수신 감도가 미약하거나)로 사용자의 마지막 위치를 캐시하고 싶을 것이다.
이는 사용자의 위도와 경로를 float로 변환한 후 SharedPreference 인스턴스에 이 float 값을 저장하는 방법으로 쉽게 할 수 있다.
/**
* 위치 캐시
*/
// LOCATION MANAGER 초기화
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// ...
// LOCATION LISTENERS 무시한다.
// ...
Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
float lat = (float) lastKnownLocation.getLatitude();
float lon = (float) lastKnownLocation.getLongitude();
Editor e2 = sp.edit();
e2.putFloat("latitudeCache", lat);
e2.putFloat("longitudeCache", lon);
e.commit();
안드로이드 API 레벨 11에는 관련 키로 일련의 문자열 객체를 설정하거나 가져올 수 있게 하는 새로운 getStringSet() 메소드가 있다.
getStringSet이 어떻게 동작하는지 살펴보자.
Set<String> values = new HashSet<String>();
values.add("Hellp");
values.add("World");
Editor e = sp.edit();
e.putStringSet("strSetKey", values);
e.commit();
Set<String> ret = sp.getStringSet(values, new HashSet<String>());
for(String r : ret){
Log.i("SharedPreferencesExample", "Retrieved vals : " + r);
}
이와 관련된 사용 사례는 다양하지만, 지금은 그냥 넘어가자.
전체 소스
package jwei.apps.dataforandroid.ch1;
import jwei.apps.dataforandroid.R;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.EditText;
/**
* Examples for use cases as defined in Chapter 1 of Data for Android.
*
* @author Jason Wei
*
*/
public class SharedPreferencesExample2 extends Activity {
private static final String MY_DB = "my_db";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences sp = getSharedPreferences(MY_DB, Context.MODE_PRIVATE);
/**
* CHECK IF THIS IS USER'S FIRST VISIT
*/
boolean hasVisited = sp.getBoolean("hasVisited", false);
if (!hasVisited) {
// ...
// SHOW SPLASH ACTIVITY, LOGIN ACTIVITY, ETC
// ...
// DON'T FORGET TO COMMIT THE CHANGE
Editor e = sp.edit();
e.putBoolean("hasVisited", true);
e.commit();
}
/**
* CHECK LAST VISIT TIME
*/
long lastVisitTime = sp.getLong("lastVisitKey", 0L);
long timeElapsed = System.currentTimeMillis() - lastVisitTime;
// YOUR UPDATE FREQUENCY HERE
final long UPDATE_FREQ = 1000 * 60 * 60 * 24;
if (timeElapsed > UPDATE_FREQ) {
// ...
// PERFORM NECESSARY UPDATES
// ...
}
// STORE LATEST UPDATE TIME
Editor e = sp.edit();
e.putLong("lastVisitKey", System.currentTimeMillis());
e.commit();
/**
* CACHE USER NAME AS STRING
*/
// TYPICALLY YOU WILL HAVE AN EDIT TEXT VIEW
// WHERE THE USER ENTERS THEIR USERNAME
EditText userNameLoginText = (EditText) findViewById(R.id.login_editText);
String userName = userNameLoginText.getText().toString();
Editor e1 = sp.edit();
e1.putString("userNameCache", userName);
e1.commit();
/**
* REMEBERING A CERTAIN STATE
*/
boolean isSilentMode = sp.getBoolean("isSilentRinger", false);
if (isSilentMode) {
// ...
// TURN OFF SOUND
// ...
}
/**
* CACHING A LOCATION
*/
// INSTANTIATE LOCATION MANAGER
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// ...
// IGNORE LOCATION LISTENERS
// ...
Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
float lat = (float) lastKnownLocation.getLatitude();
float lon = (float) lastKnownLocation.getLongitude();
Editor e2 = sp.edit();
e2.putFloat("latitudeCache", lat);
e2.putFloat("longitudeCache", lon);
e.commit();
}
}
'Programing > Android' 카테고리의 다른 글
[SQL/DB] SQLite 데이터베이스 (0) | 2013.11.15 |
---|---|
[SQL/DB] 외부 저장소 메소드 (0) | 2013.11.15 |
[SQL/DB] 내부 저장소 메소드 (0) | 2013.11.15 |
[SQL/DB] SharedPreferences의 사용 (0) | 2013.11.13 |