posted by 프띠버리 2013. 11. 15. 09:54

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
posted by 프띠버리 2013. 11. 13. 16:22

SharedPreferences는 안드로이드 애플리케이션에 지역 데이터를 저장하기 위한 가장 단순하고 빠른 효과적인 방법이다.

SharedPreferences는 애플리케이션을 통해 다양한 키/값 쌍을 저장하고 연관 짓게 해주는 필수 프레임워크이며, 모든

애플리케이션은 자신의 SharedPreferences 클래스와 관련돼 있기 때문에 저장 후 커밋(committed)된 데이터는 모든

사용자 세션을 넘어 유지된다. 하지만 SharedPreferences의 단숨함과 효율적인 특성으로 인해 기본 데이터 타입만 저장

가능하므로 SharedPreferences의 저장 대상에 대해 유념해야 한다.

(기본 데이터 타입 : boolean, float, long, int, string)

<예제>

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.os.Bundle;

import android.util.Log;

 

/**

 * Examples for initial case as defined in Chapter 1 of Data for Android.

 *

 * @author Jason Wei

 *

 */

public class SharedPreferencesExample extends Activity {

 

    private static final String MY_DB = "my_db";

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

        SharedPreferences sp = getSharedPreferences(MY_DB, Context.MODE_PRIVATE);

 

        Editor e = sp.edit();

        e.putString("testStringKey", "Hello World");

        e.putBoolean("testBooleanKey", true);

        e.commit();

 

        String stringValue = sp.getString("testStringKey", "error");

        boolean booleanValue = sp.getBoolean("testBooleanKey", false);

 

        Log.i("SharedPreferencesExample", "Retrieved string value: " + stringValue);

        Log.i("SharedPreferencesExample", "Retrieved boolean value: " + booleanValue);

    }

}

-----------------------------------------------------------------------------------------------------------------------------------

 

getSharedPreferences(String mapName, int mapMode)

MODE 설명 

MODE_WORLD_READABLE : 다른 애플리케이션에서 접근 가능하게 맵의 가시성을 설정한다. 내용은 읽기 전용이다.

MODE_WORLD_WRITABLE : 다른 애플리케이션에서 접근 가능하게 맵의 가시성을 설정한다. 읽기와 쓰기 모두 가능.

MODE_MULTI_PROCESS : API 레벨 11 이후로 사용 가능한 모드. 다중 프로세스에 의해 맵을 수정할 수 있게 허용함.

                                      동일한 SharedPreferences 인스턴스에 쓰기 작업이 일어날 수 있다.

 

posted by 프띠버리 2013. 10. 16. 15:18

DB를 이용한 간단 메모장 앱 완성본 파일


1. 테이블 및 셀 USER INTERFACE로 바꿈

2. 화면전환 효과 적용(메모장을 넘기고 펼치는듯한 느낌)

3.기존의 버튼들 아이콘화



MemoPad.zip



'Programing > IOS' 카테고리의 다른 글

DB를 이용한 간단 메모장 앱  (0) 2013.10.14
간단한 흔들기 제스쳐  (0) 2013.10.07
SQL 을 이용한 DB프로그램 테이블에 뿌리기  (0) 2013.10.07
세그먼트 연습  (0) 2013.10.04
구구단 퀴즈 프로그램 앱  (0) 2013.10.04