[안드로이드] 데이터 저장/관리/사용
- 프로그래밍 정보
- 2010. 10. 19.
반응형
여느 플랫폼이나 마찬가지 겠지만 가장 중요한 것은 "데이터" 입니다.
이 데이터를 어떻게 안전하고, 영구적으로 보관하고, 저장할 시 참조횟수를 줄이며 빠르고 정확하게 하느냐가 언제나 문제점이 되곤 하죠.
지금은 DB가 굉장히 경량회 되고 사용하기 쉽고, 여러가지 면에서 단점보단 장점이 너무많기 때문에 어떤걸 만들더라도 데이터베이스 이용을 하지 않고서는 힘들지 않을까...생각해 봅니다.
여기에서 제가 말하는 DB 란 흔히 DBMS 를 포함한 파일시스템, 또는 기타 등등에 영구적 저장이 되는 그 어떤곳이라도 의미를 가질 수 있겠습니다.
흔히 JSP 같은 경우 오라클, 윈도서버 같은 경우 ms계열의 DB 시스템을 사용하지요. 물론 MySQL 도 있습니다.
모바일 플랫폼인 안드로이드는 어떻게 이렇게나 중요한 DB를 관리할 수 있을까요?
안드로이드는 일반적인 파일 시스템과는 조금 다른 방식으로 데이터를 관리합니다.
안드로이드의 모든 어플리케이션 데이터는 그 어플리케이션에게 private 하게 처리됩니다.
무슨 말인고 하니... A 라는 어플리케이션이 만든 데이터베이스는 A 라는 어플리케이션만 사용할 수 있다는 의미입니다.
하지만 public 하게 만들기 위해 완전히 방법이 없는것은 아니고, 컨텐트 프로바이더를 이용하면 private 한 데이터를 다른 어플리케이션에서도 사용할 수 있습니다.
컨텐트 프로바이더는 어플리케이션 데이터에 ' 읽기/쓰기 ' 접근을 제공하는 컴포넌트 입니다.
이러한 접근은 컨텐트 프로바이더의 제약조건에 기준하여 처리되지요. 컨텐트 프로바이더는 데이터를 ' 요청/수정 ' 하는 문법과 리턴된 데이터를 읽는 것에 대한 매커니즘을 가지고 있습니다.
즉, 이미지,오디오,비디오 등의 표준 데이터 타입에 대한 다수의 컨텐트 프로바이더를 지원한다는 얘기입니다.
어쨋거나 어플리케이션의 데이터는 어딘가에는 저장이 되어야 하겠는데, 여기에는 4가지의 기술이 있습니다. ( 프리퍼런스, 파일, DB, 네트워크 ) 가 그것입니다.
프리퍼런스는 기본 데이터 타입에 대한 키와값의 쌍을 저장하고 가져오는 가벼운 기법이라 하겠는데요.
일반적으로 어플리케이션이 시작될 때 로드될 인사말이나 텍스트 색상같은 어플리케이션의 환경설정 정보를 저장하기 위해 사용됩니다.
값을 읽고 쓰기 위해 Context.getSharedPreferences() 메소드를 호출합니다. 또 같은 어플리케이션 내의 다른 컴포넌트에게 공유하고 싶다면 프리퍼런스에 이름을 할당해야 합니다.
호출하려는 액티비티의 private 데이터 영역에 이 값들을 유지하려면 Activity.getPreferences() 메소드를 사용합니다.
결국에는 컨텐트 프로바이더를 사용하지 않는다면 프리퍼런스를 어플리케이션 사이에서 공유할 수는 없겠죠.
참고할 만한 예제가 있네요. 소리없는 키 입력 모드 프리퍼런스 예제입니다.
모바일 디바이스에 또는 SD 카드같은 추가 저장 매체에 파일을 저장할 수도 있겠죠.
문제는 디폴트로 다른 어플리케이션은 이 파일에 접근할 수 없다는 것입니다.
파일에서 데이터를 읽으려면 Context.openFileInput() 메소드를 호출하면서 인자로 파일 이름과 경로를 전달합니다. 그러면 이 메소드는 Java 표준 FileInputStream 객체를 리턴합니다.
파일에서 데이터를 쓰기 위해서는 이름과 경로를 포함하는 Context.openFileOutput() 메소드를 호출합니다. 이것은 FileOutputStream 을 리턴합니다.
이 두 메소드의 파일 접근은 로컬 파일에만 적용되며 다른 어플리케이션의 파일에는 접근할 수 없습니다.
안드로이드 API 는 SQLite 의 DB 시스템을 완벽히 지원해 줍니다.
생성된 각각의 DB는 그것을 생성한 어플리케이션에게 private 한 것으로 처리됩니다.
SQLite Database 객체는 DB를 나타내고, 상호작용하여 쿼리문을 날리고, 데이터를 관리하는 메소드들을 가지고 있습니다.
DB를 생성하기 위해서는 SQLiteDatabase.create() 메소드를 호출하세요.
다음으로 서브클래스인 SQLiteOpenHelper 를 사용하면 됩니다.
안드로이드는 DB에 대한 관리 기능도 제공해 주지요. 즉 여러가지 (문자열, 이미지 등)의 데이터 타입도 지원한다는 이야기 입니다. 추가적으로 DB 테이블을 찾거나 SQL 문을 날리거나 다른 작업을 하기 위한 DB 도구를 포함하고 있습니다.
그것이 adb 입니다.
adb 사용
DB 사용법 보다는 기본 개념 이해에 중점을 두고 싶네요;
최근엔 DB 백업이 된다는데... 아직 정확히 파악을 못했습니다 으하하하;;;;
끝~~
이 데이터를 어떻게 안전하고, 영구적으로 보관하고, 저장할 시 참조횟수를 줄이며 빠르고 정확하게 하느냐가 언제나 문제점이 되곤 하죠.
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
지금은 DB가 굉장히 경량회 되고 사용하기 쉽고, 여러가지 면에서 단점보단 장점이 너무많기 때문에 어떤걸 만들더라도 데이터베이스 이용을 하지 않고서는 힘들지 않을까...생각해 봅니다.
여기에서 제가 말하는 DB 란 흔히 DBMS 를 포함한 파일시스템, 또는 기타 등등에 영구적 저장이 되는 그 어떤곳이라도 의미를 가질 수 있겠습니다.
흔히 JSP 같은 경우 오라클, 윈도서버 같은 경우 ms계열의 DB 시스템을 사용하지요. 물론 MySQL 도 있습니다.
모바일 플랫폼인 안드로이드는 어떻게 이렇게나 중요한 DB를 관리할 수 있을까요?
안드로이드는 일반적인 파일 시스템과는 조금 다른 방식으로 데이터를 관리합니다.
안드로이드의 모든 어플리케이션 데이터는 그 어플리케이션에게 private 하게 처리됩니다.
무슨 말인고 하니... A 라는 어플리케이션이 만든 데이터베이스는 A 라는 어플리케이션만 사용할 수 있다는 의미입니다.
하지만 public 하게 만들기 위해 완전히 방법이 없는것은 아니고, 컨텐트 프로바이더를 이용하면 private 한 데이터를 다른 어플리케이션에서도 사용할 수 있습니다.
컨텐트 프로바이더는 어플리케이션 데이터에 ' 읽기/쓰기 ' 접근을 제공하는 컴포넌트 입니다.
이것은 어플리케이션에서 있어도 되고 없어도 됩니다.
이러한 접근은 컨텐트 프로바이더의 제약조건에 기준하여 처리되지요. 컨텐트 프로바이더는 데이터를 ' 요청/수정 ' 하는 문법과 리턴된 데이터를 읽는 것에 대한 매커니즘을 가지고 있습니다.
즉, 이미지,오디오,비디오 등의 표준 데이터 타입에 대한 다수의 컨텐트 프로바이더를 지원한다는 얘기입니다.
어쨋거나 어플리케이션의 데이터는 어딘가에는 저장이 되어야 하겠는데, 여기에는 4가지의 기술이 있습니다. ( 프리퍼런스, 파일, DB, 네트워크 ) 가 그것입니다.
프리퍼런스(Preferences)
프리퍼런스는 기본 데이터 타입에 대한 키와값의 쌍을 저장하고 가져오는 가벼운 기법이라 하겠는데요.
일반적으로 어플리케이션이 시작될 때 로드될 인사말이나 텍스트 색상같은 어플리케이션의 환경설정 정보를 저장하기 위해 사용됩니다.
값을 읽고 쓰기 위해 Context.getSharedPreferences() 메소드를 호출합니다. 또 같은 어플리케이션 내의 다른 컴포넌트에게 공유하고 싶다면 프리퍼런스에 이름을 할당해야 합니다.
호출하려는 액티비티의 private 데이터 영역에 이 값들을 유지하려면 Activity.getPreferences() 메소드를 사용합니다.
결국에는 컨텐트 프로바이더를 사용하지 않는다면 프리퍼런스를 어플리케이션 사이에서 공유할 수는 없겠죠.
참고할 만한 예제가 있네요. 소리없는 키 입력 모드 프리퍼런스 예제입니다.
파일(File)
모바일 디바이스에 또는 SD 카드같은 추가 저장 매체에 파일을 저장할 수도 있겠죠.
문제는 디폴트로 다른 어플리케이션은 이 파일에 접근할 수 없다는 것입니다.
파일에서 데이터를 읽으려면 Context.openFileInput() 메소드를 호출하면서 인자로 파일 이름과 경로를 전달합니다. 그러면 이 메소드는 Java 표준 FileInputStream 객체를 리턴합니다.
파일에서 데이터를 쓰기 위해서는 이름과 경로를 포함하는 Context.openFileOutput() 메소드를 호출합니다. 이것은 FileOutputStream 을 리턴합니다.
이 두 메소드의 파일 접근은 로컬 파일에만 적용되며 다른 어플리케이션의 파일에는 접근할 수 없습니다.
데이터베이스(Database)
안드로이드 API 는 SQLite 의 DB 시스템을 완벽히 지원해 줍니다.
생성된 각각의 DB는 그것을 생성한 어플리케이션에게 private 한 것으로 처리됩니다.
SQLite Database 객체는 DB를 나타내고, 상호작용하여 쿼리문을 날리고, 데이터를 관리하는 메소드들을 가지고 있습니다.
DB를 생성하기 위해서는 SQLiteDatabase.create() 메소드를 호출하세요.
다음으로 서브클래스인 SQLiteOpenHelper 를 사용하면 됩니다.
안드로이드는 DB에 대한 관리 기능도 제공해 주지요. 즉 여러가지 (문자열, 이미지 등)의 데이터 타입도 지원한다는 이야기 입니다. 추가적으로 DB 테이블을 찾거나 SQL 문을 날리거나 다른 작업을 하기 위한 DB 도구를 포함하고 있습니다.
그것이 adb 입니다.
adb 사용
adb remote shell 에서, 어플리케이션이 생성한 DB 관리를 위해 sqlite3 커맨드 라인 프로그램을 사용할 수 있습니다.
이 툴은 테이블 컨텐츠를 출력하는 .dump ,
SQL 문을 출력하는 .schema
같은 많은 명령어를 포함하고 있습니다. 또한 작동 도중에라도 SQLite 명령문을 실행할 수 있게 해주죠
sqlite3 를 사용하려면, 에뮬레이터 인스턴스에 remote shell 을 입력하세요. 그 다음 DB의 전체 경로를 지정하여 탐색하려는 DB를 선택하고, 명령어를 통해 그 툴을 불러내야 합니다.
에뮬레이터나 디바이스 인스턴스는 SQLite DB를
이 부분에 대한 사항은 제가 예전에 포스팅한 글:
안드로이드 DB 관리툴 sqlite3 . CMD 에서 한글 출력하기. [ 추가내용 ]
를 참고하시면 될것 같습니다.
sqlite3 를 불러내면 이제 이 shell 에서 명령어를 실행할 수 있게 됩니다. 이것을 종료하고 다시 adb remote shell 로 가려면 .exit 나 Ctrl+D 버튼을 이용합니다.
추가적으로 빠르게 레코드를 찾기 위해 고유한 ID가 있는 자동증가 값 필드(대체로 primary key 겟죠^&^) 사용이 권장되고 있습니다. 로컬 데이터에 대해서는 선택사항이며, 만약 컨텐트 프로바이더를 구현하여 DB를 공유할 생각이라면 무조건 반드시!!! 포함해야 합니다.
생성된 DB는 어플리케이션 내에서는 어디서나 이름에 의해 접근이 가능합니다.
하지만 다른 어플리케이션에서는 불가능 합니다.
이 툴은 테이블 컨텐츠를 출력하는 .dump ,
SQL 문을 출력하는 .schema
같은 많은 명령어를 포함하고 있습니다. 또한 작동 도중에라도 SQLite 명령문을 실행할 수 있게 해주죠
sqlite3 를 사용하려면, 에뮬레이터 인스턴스에 remote shell 을 입력하세요. 그 다음 DB의 전체 경로를 지정하여 탐색하려는 DB를 선택하고, 명령어를 통해 그 툴을 불러내야 합니다.
에뮬레이터나 디바이스 인스턴스는 SQLite DB를
/data/data/패키지명/databases/
디렉토리에 저장을 합니다.이 부분에 대한 사항은 제가 예전에 포스팅한 글:
안드로이드 DB 관리툴 sqlite3 . CMD 에서 한글 출력하기. [ 추가내용 ]
를 참고하시면 될것 같습니다.
sqlite3 를 불러내면 이제 이 shell 에서 명령어를 실행할 수 있게 됩니다. 이것을 종료하고 다시 adb remote shell 로 가려면 .exit 나 Ctrl+D 버튼을 이용합니다.
추가적으로 빠르게 레코드를 찾기 위해 고유한 ID가 있는 자동증가 값 필드(대체로 primary key 겟죠^&^) 사용이 권장되고 있습니다. 로컬 데이터에 대해서는 선택사항이며, 만약 컨텐트 프로바이더를 구현하여 DB를 공유할 생각이라면 무조건 반드시!!! 포함해야 합니다.
생성된 DB는 어플리케이션 내에서는 어디서나 이름에 의해 접근이 가능합니다.
하지만 다른 어플리케이션에서는 불가능 합니다.
DB 사용법 보다는 기본 개념 이해에 중점을 두고 싶네요;
최근엔 DB 백업이 된다는데... 아직 정확히 파악을 못했습니다 으하하하;;;;
끝~~
관련글
반응형