[android] ContentProvider

이아름·2022년 10월 14일
0

안드로이드

목록 보기
11/13
post-thumbnail

What is ContentProvider?

Content Provider

  • 어떤 앱이 다른 앱으로 데이터를 제공하고자 할 경우 사용
  • 요청을 하면 ContentResolver 클래스에 의해 처리된다.
  • DB, 파일, 네트워크 등 다양한 방법으로 데이터를 저장할 수 있다.

Why ContentProvider?

  • DB 앞에 추상화 단계를 한 단계 둠으로써 서로 다른 앱이 같은 코드로 ContentProvider에 접근할 수 있다.
    -> DB에 직접 접근하지 않아 안전하다.
  • 서로 다른 앱이 CRUD 할 때 권한, 데이터 안전성(규칙)을 체크하기위해 ContentProvider를 사용할 수 있다.
  • CursorLoad나 CursorAdapter와 같은 클래스들이 ContentProvider를 사용한다.
  • 하나의 안드로이드 디바이스에는 다수의 ContentProvider가 존재할 수 있다.
  • 특정 Content가 어떤 앱과 통신하는지 알아야하며 모든 데이터의 동기화를 유지해야한다.
    => ContentProvider로 해당 문제를 해결할 수 있다.

How to use?

  • ContentResolver에서 아래 메서드들 중 하나를 호출하면 ContentResolver가 ContentProvider에게 요청을 보낸다.
    -> query() : 데이터 Read
    -> insert() : 데이터에 행 추가
    -> update() : 데이터 갱신
    -> delete() : 데이터에서 행 삭제
ContentResolver의 래퍼런스
  • 해당 래퍼런스로 query 메서드 호출

  • URI, projection, selection, selectionArgs, sortOrder을 요소로 받는다.

  • URI(Uniform Resource identifer) : 데이터의 위치를 표시하고 데이터를 가져오기 위해 사용
    형태 : ":content://authority/path/id"
    ex) content://com.android.contacts/contacts
    -> content:// : URI를 나타냄
    -> authority : key 역할을 함 / 중복 x / 주로 패키지명을 사용
    -> path : 가상의 경로
    -> id까지 있으면 하나의 데이터만 가져옴, id가 없고 마지막이 path면 복수의 데이터를 가져옴

  • projection : 필터링, 가져올 값을 나타냄

  • selection : 필터링 방법, 어떻게 가져올지

  • selection arguments : 필터링 대상

  • sort order : 데이터 정렬 순서

-> query에서

select {projection}
from {URI}
where {selection} = {selection arguments}
orderby {sort order} 

의 형태로 값을 가져온다.


  • ContentProvider에는 권한이 필요하지 않은 것과 권한이 필요한것이 있다.
    -> 주로 앱 내부의 데이터를 가져오면 권한이 필요하지 않지만 앱 외부 데이터를 가져오려면 권한이 필요하다.

ContentProvider 접근

  • Intent로 접근
  • cursor 사용
  • cursorAdapter 사용

UriMatcher

val uriMatcher = UriMatcher(UriMatcher.NO_ACTION).apply{
	addURI(Notes.AUTHORITY, "notes",NOTES)
    addURI(Notes.AUTHORITY, "notes/0", NOTE_ID)
}
...
override fun delete(...){
  when(uirMatcher.match(uri){
      NOTES -> {
          //error
      }
      NOTE_ID -> {
      	val id = ContentUris.parseId(uri)
        ...
     }
  }
}
  • uri를 분석해서 단건인지 복수인지 확인한다.
  • NOTES : notes(path)로 끝나는 것 -> 복수
  • NOTE_ID : 특정 id가 있는것 -> 단수
profile
반갑습니다

0개의 댓글