note

안드로이드 - 자료관리 본문

Android/기본

안드로이드 - 자료관리

투한 2012. 2. 17. 14:37








1.리눅스 숨김파일로 인식하기 위한 옳은 설명은?

①  "\" 역슬래시 로 시작하는 파일명
② "/" 슬래시 로 시작하는 파일명 
③  "#" 로 시작하는 파일명
④  "." 로 시작하는 파일명


2.다음 설명중 옳은 설명은?
① SD카드는 단순 데이터 저장 장소이며 보안이 적용되어 있으며 접근하기 어렵다
② 인증서는 어플리케이션 간의 신뢰를 쌓기 위해 사용될 뿐이다. 
③ SD카드는 WRITE_EXTERNAL_STORAGE 퍼미션을 지정해야 한다 
④   SD카드의 경로를 상수로 가정해서는 안되며 반드시 실행 중에 조사해야 한다.  


3.Context Class의 파일 입출력 에 관한문제 입니다 옳게 이어져 있는것은?
① MODE_PRIVATE :  다른 응용 프로그램이 파일을 읽도록 허용한다. 
② MODE_APPEND : 혼자만 사용하는 배타적인 모드로 파일을 생성한다. 이 모드가 디폴트이다.
③ MODE_WORLD_READABLE : 파일이 이미 존재할 경우 덮어쓰기 모드로 열지 않고 추가모드로 연다. 이후 기록되는 내용은 기존 내용 뒤에 덧붙여진다.
④ MODE_WORLD_WRITEABLE : 다른 응용 프로그램이 파일을 기록하도록 허용한다.
4.1 
4.파일에 대한 설명입니다 다음중 틀린것은?
 

①  파일의 위치는 /data/data/패키지명/files 디렉토리로 정해져 있다
②  임의 경로의 파일을 마음대로 열 수는 없다 
③  자신의 디렉토리만 액세스 가능하므로 경로는 지정할 수 없고 반드시 파일명만 적어야 한다. 
④  파일명에 경로를 표시하는 / 문자가 들어가면 에러 처리된다. 



5.Preferences 에 대한 설명중 틀린것은?
①  프레퍼런스는 응용 프로그램의 설정 정보를 1회성으로 저장하는 장치이다.  
②  Preferences의 데이터를 관리하는 클래스는 SharedPreferences이다. 응용 프로그램 내의 모든 액티비티가 공유한다. 
③  키와 값의 쌍으로 데이터를 저장한다.  
④  최초 실행될 때에는 생성되기 전이므로 디폴트가 리턴된다. 


6.SQLite에 대한 설명중 맞는것은? 
①  쿼리 결과는 대단히 양이 많을 수 있으므로 결과셋 자체가 리턴되며 위치를 가리키는 커서로 리턴된다. 
②  다 읽은 후 커서는 반드시 닫아야하며 DB도 닫아야 한다. 
③  안정적이고 용량이 작아 소규모의 데이터베이스에 적합하다.  
④  커서는 결과셋의 한 위치를 가리키는 일종의 포인터, 랜덤 액세스를 지원하지 않는다.  

7.Cursor에 대한 설명중 맞는것은?
①   커서를 사용하는 어댑터의 생성자 SimpleCursorAdapter
②  결과셋이 많을때도 쿼리로 전체를 다 읽어 화면에 출력해도 굉장히 빠르다 
③  startManagingCursor 메소드는 액티비티의 생명주기에 맞춰 커서를 자동으로 관리하도록 요청하며 이후 이 커서는 액티비티와 별개로 종료를 시켜야 한다.
④  결과셋을 가지는 커서를 어댑터에 바인딩 할 수 없다


8. URI 에 대한 설명중 틀린것은?
① 누가 어떤 정보를 제공하는지, 또 어떤 정보를 원하는지에 대한 정보가 URI에 작성된다 
② 국제 표준에 URI는 해당되지 않는다
③ 정보의 고유한 명칭으로서 웹상의 주소를 나타내는 URL보다 더 상위의 개념이다.
④ 안드로이드의 보안 정책상, 응용 프로그램이 만든 데이터는 기본적으로 혼자만 액세스 가능하다 


9.CP에 대한 설명중 틀린것은?
①  URI만 알면 누구나 CP의 데이터를 액세스할 수 있다는 면에서 보안상의 위험이 있을 것 같아 보이지만 안전장치가 있다  
②  CP는 응용 프로그램에 존재하는 데이터를 외부로 공개하는 역할을 할 뿐이다. 
③ 
④  

① 
② 
③ 
④  

8. CP 
 

- CP를 만들려면 우선 ContentProvider 클래스를 상속 받아야 하며 정보를 관리 및 제공하는 메소드를 재정의 해야 한다.

- onCreat는 CP가 로드될 때 호출되는데 여기서 제공할 데이터를 준비한다. 

- getType(Uri uri)는 제공하는 데이터의 MIME 타입을 조사한다. 

- 단수 : vnd.회사명.cursor.item/타입 

복수 : vnd.회사명.cursor.dir/타입 

- CP는 응용 프로그램에 존재하는 데이터를 외부로 공개하는 역할을 할 뿐이다. 

- <provider android:name=“CP이름” android:authorities="제공자명 /> 으로 매니페스트에 등록 

- 컨텐츠를 읽으려며 먼저 ContentResolver 객체를 구한다. 리졸버는 쿼리를 통해 CP와 간접적으로 통신하는 표준 인터페이스이다.

- 접근할 Provider가 실행 중이 아니라면 시스템이 메모리로 올리므로 꼭 실행 중이어야 할 필요는 없다.

- 삽입 메소드는 레코드 하나만 삽입하는 insert와 여러 개의 레코드 배열을 한꺼번에 삽입하는 bulkInsert 두 가지가 제공된다.

- CP는 데이터 구조를 추상화하여 데이터를 저장, 관리하는 작업과 데이터를 사용하는 작업을 분리하는 역할을 한다.

CP는 데이터를 저장, 관리하는 일에만 집중하고 응용 프로그램들은 CP로부터 데이터를 받아 다양한 형태로 보여주고 사용자로부터 정보를 입력받아 CP로 전달한다. 

- URI만 알면 누구나 CP의 데이터를 액세스할 수 있다는 면에서 보안상의 위험이 있을 것 같아 보이지만 안전장치가 있다. CP는 필요할 경우 퍼미션을 요구할 수 있으며, 특정 응용 프로그램만 데이터에 접근할 수 있도록 차단할 수 있다. 퍼미션이 없는 응용 프로그램은 설치 단계에서 거부된다.



4
2
4
1
3
1
2








2. Context Class의 파일 입출력 

- 안드로이드에서 자바의 모든 입출력 기능을 다 사용할 수 있는 것은 아니다. 보안상의 이유로 임의 위치의 파일을 아무나 읽고 쓸 수 없으며 응용 프로그램은 허가받은 위치에만 파일을 생성할 수 있고 자신이 만든 파일만 액세스할 수 있다. 

- 자바 입출력 라이브러리로 이 제한을 일일이 준수하기 어려우므로 Context 클래스는 보안이 적용된 파일 관리 메소드를 별도로 제공한다.

파일을 열 때는 다음 두 메소드를 사용해야 한다. 

openFileOutput(String name, int mode); 쓰기용 

openFileInput(String name); 읽기용 각각 파일을 열어 스트림을 리턴한다. 


- 파일을 생성할 때는 다음 mode중 하나를 지정한다. 

MODE_PRIVATE : 혼자만 사용하는 배타적인 모드로 파일을 생성한다. 이 모드가 디폴트이다. 

MODE_APPEND : 파일이 이미 존재할 경우 덮어쓰기 모드로 열지 않고 추가모드로 연다. 이후 기록되는 내용은 기존 내용 뒤에 덧붙여진다.

MODE_WORLD_READABLE : 다른 응용 프로그램이 파일을 읽도록 허용한다. 

MODE_WORLD_WRITEABLE : 다른 응용 프로그램이 파일을 기록하도록 허용한다.

- 파일을 열면 스트림이 리턴되는데 이후부터 read,write 같은 자바의 스트림 입출력 메소드로 파일의 내용을 읽고 쓴다.

- deleteFile(String name), fileList() 파일을 삭제하거나 파일 목록을 구한다. 

3. SD카드 (P.1017) 

- 단순 데이터 파일을 저장하기 위한 장소로 sd카드가 주로 사용되며, 안드로이드는 sd카드에 대해서는 보안을 적용하지 않는다. sd카드는 운영체제와는 분리된 기억장치이며 리눅스 파일 시스템으로 포맷되어 있지 않고 훨씬 더 단순한 FAT 포맷으로 되어 있기 때문에 보안상의 제약없이 누구나 파일을 읽고 쓸 수 있다. 또한 용량도 크다. 

- WRITE_EXTERNAL_STORAGE 퍼미션을 지정해야 한다. 

- 장착 상태와 경로를 조사할 때는 Environment 클래스의 정적 메소드를 호출한다.

- SD카드의 경로를 상수로 가정해서는 안되며 반드시 실행 중에 조사해야 한다. 

4. Preferences 

- 프레퍼런스는 응용 프로그램의 설정 정보를 영구적으로 저장하는 장치이다. 

- XML 포맷의 텍스트 파일에 정보를 저장하므로, 세팅파일이나 INI파일에 더 가깝다. 사용자가 생성해낸 큰 문서에 비해 용량이 상대적으로 작고 다른 컴퓨터로 옮길 필요가 없다는 점이 다르다.

- Preferences의 데이터를 관리하는 클래스는 SharedPreferences이다. 응용 프로그램 내의 모든 액티비티가 공유한다.

- 한쪽 액티비티에서 preferences의 정보를 수정하면 다른 액티비티도 수정된 값을 읽을 수 있다. 그러나 응용 프로그램의 고유한 정보이므로 외부에서는 읽을 수 없다. 

- getSharedPreferences(String name, int mode) 프레퍼런스 생성 mode가 0이면 읽기,쓰기가 가능하다

- getPreferences(int mode) 생성한 액티비티 전용 프레퍼런스 생성, 액티비티와 이름이 같은 xml파일이 생성된다.

- 키와 값의 쌍으로 데이터를 저장한다. 

- 최초 실행될 때에는 생성되기 전이므로 디폴트가 리턴된다. 

- 프레퍼런스 클래스 자체에는 값을 읽는 메소드만 제공되며 값을 기록하는 메소드는 이너 클래스인 SharedPreferences.Editor가 제공한다.

- 값을 읽는 것에 비해 변경할 때는 동기화를 해야 하는데 Editor는 모든 변경을 모아 두었다가 한꺼번에 적용하는 트랜잭션 기능을 제공한다.

- 데이터를 저장할 때는 프레퍼런스의 edit 메소드를 호출하여 Editor 객체를 먼저 얻는다.

SharedPreferences pref = getSharedPreferences("PrefTest",0); 

SharedPreferences.Editor edit = pref.edit(); 

- put 메소드로 값을 저장한 후에 반드시 commit 메소드를 호출해야 실제 파일에 저장된다.

5. SQLite (관계형 데이터베이스 엔진 : RDB) 

- 안드로이드는 운영체제 차원에서 SQLite 라이브러리를 포함하고 있으므로 별도의 설정없이도 DB를 사용할 수 있다.

- 안정적이고 용량이 작아 소규모의 데이터베이스에 적합하다. 

- 데이터를 저장하는 장소가 단순한 파일이므로 별도의 서버가 필요없으며 연결이니 권한이니 하는 것도 신경쓸 필요가 없다.

- 파일일 뿐이므로 원하는대로 복사,삭제,이동할 수 있으며 복잡한 설정이나 관리 정책도 불필요하다.

- 복수 사용자는 지원하지 않지만, 용량이 작고 c언어로 작성되어 있어 속도도 빠르다. 

- 안드로이드는 DB를 관리하는 SQLiteOpenHelpe(추상클래스)r라는 도우미 클래스를 제공하는데 DB를 생성 및 오픈하는 처리를 담당한다.

- 도우미 객체를 생성해 놓으면 DB가 필요한 시점에 OnCreate, OnUpgrade, OnOpen 메소드가 호출된다.

- getReadable(읽기)(Writable(읽고쓰기))Database 메소드만 호출하면 나머지는 도우미가 알아서 처리할 것이다. DB파일이 아예 없다면 파일을 생성한 후 onCreate를 호출하여 테이블을 만들 것이고, 버전이 바뀌었으면 onUpgrade를 호출하여 변경된 버전에 맞게 테이블을 수정할 것이다.

- 아무튼, onCreate에 테이블 생성문만 작성해 놓으면 get*Database 메소드 호출만으로 DB가 열리도록 되어 있으며 SQLiteDatabase 객체가 리턴된다.

- 만약 중간에 DB의 구조를 바꾸어야 한다면 생성자로 전달되는 버전을 높이면 된다. 

- 테이블에 삽입되는 레코드는 ContentValues 클래스로 표현한다. 레코드 하나는 임의의 타입을 가지는 필드들의 집합이므로 테이블마다 형태가 다르다. 그래서 빈 객체를 만든 후 put 메소드를 호출하여 필드와 값의 쌍을 여러 개 저장한다. 삽입할 레코드가 준비되면 insert로 삽입한다.

- SELECT문이 들어간 SQL쿼리문을 사용할 때는 execSQL이 아닌 rawQuery 메소드를 사용한다. (SELECT문은 다른 SQL문과는 달리 결과 셋을 리턴하므로)

- SQL 메소드를 제공하는 이유는 편의성의 이유도 있지만 CP에서 정보를 읽을때 DB 액세스 방식과 똑같은 형식의 메소드를 제공함으로써 임의의 정보를 액세스하는 방식을 통일하기 위해서이다. 

- 쿼리 결과는 대단히 양이 많을 수 있으므로 결과셋 자체가 리턴되지 않으며 위치를 가리키는 커서로 리턴된다.

- 커서는 결과셋의 한 위치를 가리키는 일종의 포인터, 랜덤 액세스를 지원한다. 

- 쿼리를 실행한 후 리턴되는 커서는 결과셋의 첫 레코드 이전을 가리킨다. 그래서 첫 레코드를 읽으려면 moveToNext나 moveToFirst메소드를 먼저 호출하여 첫 레코드로 이동해야 하며 moveToNext가 false를 리턴할 때까지 루프를 돌며 전체 결과셋을 순회한다.

- 다 읽은 후 커서는 반드시 닫아야하며 DB도 닫아야 한다. 

6-1. Cursor 

- 결과셋이 대단히 많을 때는 쿼리로 전체를 다 읽어 화면에 출력하면 굉장히 느릴 것이다. 이럴 때는 결과셋을 가지는 커서를 어댑터에 바인딩해 놓고 어댑터 뷰로 출력한다. 바인딩를 해놓으면 한꺼번에 다 읽을 필요없이 어댑터가 필요할 때 커서를 적당한 위치로 이동시켜 현재 꼭 필요한 레코드만 읽어와 어댑터 뷰 위젯에 출력한다. 

- 커서를 사용하는 어댑터의 생성자 SimpleCursorAdapter 

- startManagingCursor 메소드는 액티비티의 생명주기에 맞춰 커서를 자동으로 관리하도록 요청하며 이후 이 커서는 액티비티와 운명을 같이 한다.

7. URI 

- 안드로이드의 보안 정책상, 응용 프로그램이 만든 데이터는 기본적으로 혼자만 액세스 가능하다. 자신이 만든 데이터를 외부로 공개하려면 CP를 제공해야 한다. CP는 안드로이드 응용 프로그램을 구성하는 컴포넌트 중 하나로서 데이터를 제공하는 역할을 하며, 응용 프로그램끼리 데이터를 공유하는 유일한 방법이다.

- 정보의 위치를 나타내는 URI (Uniform Resource Identifier), 정보의 고유한 명칭으로서 웹상의 주소를 나타내는 URL보다 더 상위의 개념이다.

누가 어떤 정보를 제공하는지, 또 어떤 정보를 원하는지에 대한 정보가 URI에 작성된다. 임의의 내용을 가질 수 있는 문자열 형태이되 제공하는 자와 제공 받는 자간의 약속이므로 아무렇게나 작성할 수는 없다. 

- 국제 표준에 URI를 작성하는 방식이 명시되어 있다. 

content://authority//path/id 

- content:// 는 이 문자열이 URI임을 나타내는 접두이며 무조건 붙여야 한다. 

- authority는 정보 제공자의 명칭이되 중복되면 안되므로 패키지명을 사용할 것을 권장한다. 

- path는 정보의 종류를 지정하는 가상의 경로이다. 한 제공자가 여러개의 정보를 제공할 수도 있는데 이 때 각 정보를 경로로 구분한다.

- id는 구체적으로 어떤 정보를 원하는지 지정하되 전체 정보를 다 읽을 때는 생략할 수 있다.

- CP는 단수와 복수에 대해 두가지 형태의 URI를 각각 정의해야 한다. 단수 URI는 복수 URI뒤에 구체적인 정보를 지정하는 id가 더 추가되는 형식이다. id까지 있으면 단수이고 path까지 있으면 복수이다. 

- static Uri parse (String uriString) 메소드로 URI 객체를 생성한다. (이 메소드는 성능상의 문제로 인해 에러 처리는 하지 않는다. URI를 잘못 작성하면 예외를 발생하는 것이 아니라 쓰레기 값이 조사되므로 반드시 형식에 맞게 작성해야 한다.)

- List<String> getPathSegment()는 URI의 path 정보를 문자열 목록으로 조사한다. 이 목록의 0번째 요소가 path이며 1번째 요소가 id이되 /를 제외한 문자열만 조사된다.(get(0),get(1)) 

- 문자열 안의 요구 정보를 분석하여 정수 코드로 변환하는 UriMatcher라는 유틸리티 클래스가 제공된다.

addURI(String authority, String path, int code), match(Uri uri) 

addURI 메소드로 authority,path의 쌍으로 정수 코드와 대응시켜 맵을 등록한다. path에서 *는 임의의 문자열과 대응되며 #은 숫자 하나와 대응된다. match 메소드는 uri를 분석하여 등록된 정수 코드를 리턴한다. 발견안되면 -1를 리턴한다. 

8. CP 

- CP를 만들려면 우선 ContentProvider 클래스를 상속 받아야 하며 정보를 관리 및 제공하는 메소드를 재정의 해야 한다.

- onCreat는 CP가 로드될 때 호출되는데 여기서 제공할 데이터를 준비한다. 

- getType(Uri uri)는 제공하는 데이터의 MIME 타입을 조사한다. 

- 단수 : vnd.회사명.cursor.item/타입 

복수 : vnd.회사명.cursor.dir/타입 

- CP는 응용 프로그램에 존재하는 데이터를 외부로 공개하는 역할을 할 뿐이다. 

- <provider android:name=“CP이름” android:authorities="제공자명 /> 으로 매니페스트에 등록 

- 컨텐츠를 읽으려며 먼저 ContentResolver 객체를 구한다. 리졸버는 쿼리를 통해 CP와 간접적으로 통신하는 표준 인터페이스이다.

- 접근할 Provider가 실행 중이 아니라면 시스템이 메모리로 올리므로 꼭 실행 중이어야 할 필요는 없다.

- 삽입 메소드는 레코드 하나만 삽입하는 insert와 여러 개의 레코드 배열을 한꺼번에 삽입하는 bulkInsert 두 가지가 제공된다.

- CP는 데이터 구조를 추상화하여 데이터를 저장, 관리하는 작업과 데이터를 사용하는 작업을 분리하는 역할을 한다.

CP는 데이터를 저장, 관리하는 일에만 집중하고 응용 프로그램들은 CP로부터 데이터를 받아 다양한 형태로 보여주고 사용자로부터 정보를 입력받아 CP로 전달한다. 

- URI만 알면 누구나 CP의 데이터를 액세스할 수 있다는 면에서 보안상의 위험이 있을 것 같아 보이지만 안전장치가 있다. CP는 필요할 경우 퍼미션을 요구할 수 있으며, 특정 응용 프로그램만 데이터에 접근할 수 있도록 차단할 수 있다. 퍼미션이 없는 응용 프로그램은 설치 단계에서 거부된다.