Content Provider를 알아보자

두리두두·2024년 5월 30일
0

Android

목록 보기
22/25

  • 4대 컴포넌트 중 마지막 순서로 콘텐츠 프로바이더를 알아보자.

🏖 Content Provider란?

  • 앱끼리 데이터를 연동하는 컴포넌트
  • 컴포넌트이기 때문에 매니페스트에 등록해야한다.

    Content Provider 사용하는 두가지 경우

    • 내 애플리케이션에서 다른 애플리케이션의 Content Provider에 접근해서 데이터에 엑세스하기 위해
    • 내 애플리케이션에 Content Provider를 만들어서 다른 애플리케이션에 데이터 제공하기 위해

ex) 사진첩 앱에는 콘텐츠 프로바이더가 구현되어있어서 다른 앱에서 가져오기 가능

🏖 1. Content Provider 이용하기

준비

  • 매니페스트에 사용할 앱에 관한 패키지 공개 설정을 해줘야함
  • queries 태그 사용, provider 태그로 authorities 속성 줘도 됨.
<queries>
  	<package android:name="com.example.test_outer"/>
    <!-- 요것도 가능 -->
    <!-- <provider android:authorities="com.example.test_provider"/>-->
</queries>

사용

  • CursorLoader 호출해 ContentResolver 객체 이용
  • 화면단의 ContentResolver 객체가 접근할 앱의 Content Provider에 데이터를 요청하고 반환 받아서 사용하는 구조

ContentResolver.query()

  • ContentResolver.query() 사용하여 콘텐츠 프로바이더 호출
contentResolver.query(
	Uri.parse("content://com.example.test_provider"),
    null, null, null, null)
    )
  • query 메소드의 각 매개변수
  • 테이블(authority) 전체를 가져오고 싶으면 뒤는 다 null로 두면 됨.
  • 이 후 사용할 앱의 콘텐츠 프로바이더에 정의되어있는 함수들 쓰면 됨. (insert, update, delete...)
cursor = contentResolver.query(
        UserDictionary.Words.CONTENT_URI,   // 테이블의 주소, URI
        projection,                        // 선택해줄 column, String배열
        selectionClause,                   // 쿼리의 조건문
        selectionArgs.toTypedArray(),      // 쿼리의 조건문의 argument, 물음표를 대체할 값들
        sortOrder                          // 쿼리 소팅 조건
)


contentResolver.insert(uri, values)
  • 이 때 URI는 데이터를 가져올 경로이다. content://호스트/경로 로 사용
    ex) conent://com.example.test_provider/user/1
    => test_provider 앱의 user 테이블의 1 행

Cursor

  • ContentResolver.query() 메소드는 항상 Cursor 객체를 리턴
  • Cursor 객체는 쿼리의 결과를 읽고 쓸 수 있게 해주는 인터페이스 역할을 한다.
  • moveToNext 메소드로 결과를 하나씩 확인 가능

🏖 2. Content Provider 작성하기

  • 아래처럼 작성해두면 외부앱에서 호출할 때 자동으로 실행됨.

ContentProvider()

  • ContentProvider()를 상속받아서 작성
  • onCreate(), getType(), query(), insert(), update(), delete() 재정의!
  • query(), insert(), update(), delete() -> 얘네는 꼭 정의되어있어야 하는 추상 함수. 그러나 외부 요청을 허용하지 않으려면 만들어는 두되 아무 정의 안하면 됨.

AndoirdManifest

  • autorities 속성 필수로 선언! 외부에서 이 콘텐츠 프로바이더를 이용할 때 식별값으로 사용되는 고유한 값.
<provider
          android:name=".MyContentProvider"
          android:authorities="com.example.test_provider"
          android:enabled="true"
          android:exported="true"></provider>
  • 예제에서는 카메라, 갤러리, 지도, 전화 연동을 넣었는데 체감은 잘 안되고,, 찐 데이터베이스에 접근하는 실습 먼저 해보고 전화 앱 연동을 해야겠도다.

참고한 블로그
https://lucky516.tistory.com/171
https://velog.io/@ows3090/Android-ContentProvider-%EA%B5%AC%ED%98%84-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95#contentprovider-%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B5%AC%ED%98%84

profile
야금야금 앱 개발자

1개의 댓글