[안드로이드/Android] 외부 저장소(External Storage) Part2

Posted by 앱해피
2015. 6. 22. 13:08 안드로이드 이론

 

특정 앱과 관련된 파일을 외부 저장소(External Storage)에 저장하기

 

다른 어플리케이션에서 사용되지 않을 파일을 처리하기 위해서는, getExternalFilesDir() 메소드를 호출함으로써 외부 저장소에 특정 어플리케이션을 위한 저장소 디렉토리를 생성해야 한다. 이 메소드는 이 디렉토리에서 생성될 서브 디렉토리의 유형을 명시할 수 있는 파라미터를 받을 수 있다.(such as DIRECTORY_MOVIES). 특정 유형의 디렉토리가 필요하지 않다면, 루트 디렉터리 값을 얻기 위해서 null값을 전달하면 된다.

 

때때로, 1)외부 저장소로 사용할 목적으로 스마트폰 내부 메모리의 일부를 분리해서 가지고 있는 장치들이 있다. 그런데 2)이와 같은 장치들은 SD카드를 통해 또 다른 외부 저장소를 갖을 수 있다.

 

안드로이드 4.3이하 버전에서는 getExternalFilesDir() 메소드를 호출했을 때, 1)내부 메모리의 일부로 존재하는 "외부 저장소"에 접근할 수 있었으며, 2)외부 SD카드에 있는 데이터를 read 하거나 write할 수 있는 것은 아니였다.

 

하지만 안드로이드 4.4부터 getExternalFilesDir()를 호출해서 1) 내부 메모리의 일부로 존재하는 "외부 저장소" 2) SD카드로 제공되는 "외부 저장소" 둘 다 접근할 수 있게 됐다. getExternalFilesDir()는 각각의 두 위치에 대한 파일 배열을 반환한다. 배열의 첫번째 항목이 "주요한 데이터가 저장되는 외부 저장소"가 된다.

 

안드로이드 4.3 이하 버전에서 위에서 언급한 두 위치를 사용하고 싶다면, support library 에서

제공하는 ContextCompat.getExternalFilesDirs()를 사용하면 된다.

 

특정 앱과 관련된 캐시 파일을 외부 저장소(External Storage)에 저장하기

 

특정 어플리케이션에서 사용되는 캐시 파일들이 저장되는 외부 저장소 디렉토리를 나타내는 파일을 오픈하기 위해서는, getExternalCacheDir() 메소드를 호출해야 한다. 어플리케이션을 삭제할 때, 이 메소드를 통해서 반환된 디렉토리에 생성된 파일들도 자동으로 삭제된다.

 

위에서 언급한 ContextCompat.getExternalFilesDirs()와 유사하게, (이용가능한) SD카드 외부 저장소에 있는 캐시 디렉토리를 ContextCompat.getExternalCacheDirs()를 호출함으로써 접근할 수 있다.

 

데이터 베이스를 사용해서 데이터 저장하기

 

안드로이드는 완전한 SQLite 데이터베이스를 지원한다. 생성된 모든 데이터베이스는 어플리케이션 안의 클래스에 이름을 사용해서 접근할 수 있다. (어플리케이션 밖에서는 접근할 수 없다.)

 

SQLite 데이터베이스를 생성할 때, 추천되는 방법은 SQLiteOpenHelper 클래스의 서브클래스 형태로 구현하는 것이다. 이 클래스의 onCreate() 메소드에서는 데이터베이스안에서 테이블을 생성하는 SQLite 명령을 처리할 수 있다.

 

public class DictionaryOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);";

 

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

 

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}

 

정의된 생성자를 사용해서 SQLiteOpenHelper와 관련된 인스턴스를 얻을 수 있다. 데이터베이스를 대상으로 read/write를 하기 위해선 각각 getWritableDatabase() and getReadableDatabase()를 호출하면 된다. 이 각각의 메소드는 데이터베이스를 나타내는 SQLiteDatabase 객체를 반환하는데, 이를 이용해서 SQLite 연산을 할 수 있게 된다.

 

SQLiteDatabase query() 메소드를 이용해서 SQLite 쿼리를 실행할 수 있다. SQLite qurery() 메소드는 쿼리 결과 생성된 테이블의 모든 Row를 가리키는 Cursor객체를 반환한다. Cursor는 유저가 데이터베이스 쿼리 결과를 검색할 수 있는 메카니즘을 제공한다.

 

[추가] 안드로이드는 표준 SQLite를 확장하는 것에 제한을 두지 않는다. 그렇기 때문에 레코드를 빠르게 찾을 수 있는 자동으로 증가되는 ID 값으로 사용될 필드를 추가할 것을 추천한다. 이 필드는 필수로 존재해야 하는 것은 아니지만 당신이 content provider를 구현하고자 할 때에는, BaseColumns._ID 상수값을 사용해서 유일한 ID를 포함해야만 한다.

 

감사합니다 ^_^