본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] ContentProvider 고급 정보

by 돼지왕 왕돼지 2012. 5. 26.
반응형




http://developer.android.com/guide/topics/providers/content-providers.html 

http://developer.android.com/guide/topics/providers/content-provider-basics.html 

http://developer.android.com/guide/topics/providers/content-provider-creating.html 

- URI Matcher에서 * 은 any characters 에 # 은 any numbers 에 mapping 된다.


- ContentProvider 의 함수들은 multiple thread 에서 한번에 불릴 수 있다. 그래서 provider 가 구현하는 함수들은 반드시 thread-safe 해야 한다.


- ContentProvider 의 onCreate() 는 긴 작업을 해서는 안된다. 


- query 결과로 전달되는 Cursor 는 반드시 Database Cursor 일 필요는 없다. MatrixCursor 와 같은 Cursor 의 subclass 를 사용하여, 내용을 채워 return 을 해도 된다. MatrixCursor 는 각 row 가 Object array 이다. addRow() 를 통해 새로운 row 를 추가할 수 있다.


- Provider 에서 invalid content URI 가 올 경우 IllegalArgumentException 을 날려주는 것이 좋다.


- Provider 에서 File 을 제공할때는 getStreamTypes() 도 구현해주어야 한다. 이녀석은 String array 를 return 해준다. 예를 들어 jpeg, png, gif 를 제공한다면 { "image/jpeg", "image/png", "image/gif" } 로 return 해주면 된다.


- DatabaseOpenHelper 의 onCreate() 는 실제 Database operation 이 있을 때 최초로 한번 불린다.


- MIME type 의 subType 은 vnd.[packageName].[tableName] 을 주로 사용한다.


- External storage 에 있는 file 은 ContentProvider 로 제공할 필요가 없다. 다른 API 로도 충분히 접속 가능하기 때문이다.


- Provider를 통해 Internal Storage 에 생성 및 저장했다는 것은 다른 app 들이 모두 접근할 수 있다는 말이다. 즉 Data 들이 secure 한 것은 아니다. world-readable or world-writeable 권한이 주어지기 때문이다.


- provider 에 permission 을 줄 수 있는데, provider 전체, table 일부, record 일부 등에 제약을 줄 수 있다. android:permission 은 일반적인 read, write 전부에 대한 permission. android:wrtiePermission, android:readPermission 으로 개별 permission 을 줄 수도 있다. 이 둘은 android:permission 보다 우선한다. <path-permission> 을 통해서 Path-level permission 을 줄 수 있다.


- provider 의 permission 은 temporary permission 도 있다. temp permission 은 android:grantUriPermissions 를 주고 <grant-uri-permission> 을 <provider> 의 child 로 넣어주면 된다. temp permission 을 사용할때는 Context.revokeUriPermission() 을 call 해야 한다.android:grantUriPermissions = true 가 되면, provider-level 로 temp permission 이 주어진다. 만약 android:grantUriPermissions = false 라면 반드시 <grant-uri-permission> child element 를 설정해주어야 한다. temp permission 을 application 에 주기 위해서는 FLAG_GRANT_READ_URI_PERMISSION 또는 FLAG_GRANT_WRITE_URI_PERMISSION 을 주어야 한다. ( 2개도 가능 )


- provider 의 attribute 에는 initOrder 는 같은 process 에서 provider 의 initOrder 를 명시. multiProcess 는 client 의 process 에서 띄울 것인지, syncable 은 server data 와 sync 시킬 것인지를 결정.
 

- ContentProvider read permission 은 runtime 에 불가능하다. 반드시 Manifest 에 정의해야 한다.

- String selectionClause = "var="+userInput; 보다는 String selectionClause = "var=?"; 와 selectionArgs 로 구분하여 쓰는 것이 좋다. 앞선 방식으로 사용할 경우 userInput에 nothing;DROP TABLE *; 이라는 string 이 들어올 경우, table 의 내용이 모두 날아가지만, 후자의 경우는 SQLStatement 로 생각하지 않아서, 저런 실수를 방지할 수 있다.

- BLOB ( Binary Large OBject ) 는 64KB byte array 형태.

- getType() 은 MIME type 을 return. MIME type 은 type/subtype 의 형태로 되어있다. type 에는 multuple rows 일 경우 항상 vnd.android.cursor.dir을, single row에는 vnd.android.cursor.item 을 return 한다.subtype 에는 provider-specific 한 string 이 들어간다. 이 MIME type 관련 contant 도 contract class 에 지정되어있다. 

- ContentProviderOperation 을 통해 batch access 를 만들고, ContentResolver.applyBatch() 를 통해 batch 를 적용할 수 있다. Batch access 는 많은 양의 row 를 insert 하거나, multiple table 에 rows 를 insert 하는데 유용하다. 물론 이 녀석들은 atomic operation 이다.

- 직접 Data 내용을 가져오는건 아니지만, Intent 를 통해 Data 에 간접적으로 접근할 수 있다. ( 예를 들어, 특정 날짜의 Calendar Event 를 담은 ACTION_VIEW intent 를 날리면, 해당 날짜의 Event Activity 가 뜬다. )

- FLAG_GRANT_READ_URI_PERMISSION 이나 FLAG_GRANT_WRITE_URI_PERMISSION 을 flag 로 주면, 해당 intent 를 받은 activity 는 종료될때까지 URI 에 대한 permission 을 갖게 된다. URI 는 Intent 와 함께 전달된 URI.

- provider 에 permission 을 주려면 grantUriPermission attribute 와 <provider> 의 child인 <grant-uri-permission> 를 설정해주어야 한다.

- Contract Classes 는 content URI, column name, intent action 그리고 content provider 와 관련된 다른 특징들의 constants 들을 제공한다.

- ContentProvider 는 Database 뿐만 아니라 File Data 도 제공 가능하다.( Photo, Audio, Video 등 )



도움이 되셨다면 손가락 꾸욱~




반응형

댓글