콘텐츠 제공자를 사용하는 경우


103

콘텐츠 제공자가 애플리케이션간에 데이터를 공개적으로 공유 할 수 있도록 만들어 졌다는 것을 이해합니다. 그러나 누군가가 자신의 앱 내에서 사용하도록 콘텐츠 제공 업체를 만드는 것에 대해 생각하고 있는지 궁금합니다. 이렇게하면 어떤 이점이 있습니까? 단점이 있습니까?

과거에는 데이터베이스의 데이터에 액세스하기 위해 SQliteOpenHelper를 구현했지만 콘텐츠 공급자를 만드는 것을 고려하고 있습니다. 데이터 요청에 대한 URI 접근 방식이 명확하고 간결하다고 생각합니다. 반면에 내 애플리케이션에만 콘텐츠 제공 업체를 사용하면 중복되고 (내에 SQliteOpenHelper 클래스가 있기 때문에) 필요한 것보다 더 많은 작업을 할 수 있습니까?


2
콘텐츠 제공자를 쉽게 작성할 수 있도록 라이브러리를 만들었습니다. 일반 SQLiteOpenHelper를 작성하는 것보다 쉽습니다. github.com/coocood/VContentProvider
coocood

답변:


59

데이터를 공유 할 계획이 없다면 콘텐츠 제공 업체에 대해 생각하지 마십시오. 강력하지만 작성하기 어렵고 내부적으로 사용한다면 구현하는 것은 어리석은 일입니다.

그러나 누군가가 자신의 앱 내에서 사용하도록 콘텐츠 제공 업체를 만드는 것에 대해 생각하고 있는지 궁금합니다.

물론 ... 예를 들어 내가 작성한 오래된 TODO 목록 앱의 경우 다른 앱이 작업 상태를 검색하고 액세스 할 수 있도록 콘텐츠 제공 업체를 작성해야했습니다. 요구 사항의 일부 였지만 그 이상으로 의미가 있었고 앱을 더 멋지게 만들었습니다.


34
귀하의 정당성에 동의하지만 콘텐츠 제공 업체가 구현되면 많은 혜택을 얻는 것이 (특히 초보자에게) 중요하다고 생각합니다. 예를 들어를 사용하여 CursorLoader비동기 쿼리를 수행 할 수 있습니다. 단일 인스턴스 (the ContentResolver)에 액세스하여 쿼리 등을 수행 할 수 있습니다. 물론 SQLite 데이터베이스에 사용할 고유 한 로더를 구현할 수 있습니다. 전체 애플리케이션에 걸쳐 단일 데이터베이스 인스턴스에 대한 액세스를 구현할 수 있습니다. 물론 공유하려는 경우가 아니면 ContentProvider가 필요하지 않습니다
Alex Lockwood

11
다른 앱과 데이터. 즉, 자체 콘텐츠 공급자를 구현하면 많은 이점이 있으므로 앱이 데이터를 공유하지 않는다고해서 고려 대상에서 제외해서는 안됩니다.
Alex Lockwood

8
예, 당신이 완전히 옳지 만 대부분의 경우 노력할 가치가 없다고 생각합니다. 최소 12 개의 다른 Android 앱 (Play 스토어에 게시 됨)을 수행했으며 ContentProvider. 사실, 우리가 작업했던 마지막 앱은 처음에는 a로 만들어졌고, ContentProvider실제로 사용해야하는 것보다 사용하는 것이 엉덩이에 더 고통스럽기 때문에 삭제했습니다 ContentProvider. github.com/casidiablo/persistence 하지만 내 셀프 XD를 사용하지 않았습니다).
Cristian

1
@Cristian은 가장 실용적인 조언을 제공합니다. Android 문서에서도 ContentProvider필요하지 않은 경우 에는 사용하지 말아야한다고 명시되어 있습니다. "사용이 전적으로 자체 애플리케이션 내에서 이루어지고 필요하지 않은 경우 데이터베이스 또는 기타 유형의 영구 저장소를 사용할 제공 업체가 필요하지 않습니다. 위에 나열된 기능 중 하나입니다. 대신 앱 데이터 저장 페이지에 설명 된 스토리지 시스템 중 하나를 사용할 수 있습니다. " 그렇지 않으면 우리는 엔지니어링을 넘어 섰습니다.
Cheok Yan Cheng

요약 : 데이터를 공유 할 계획이없는 경우 콘텐츠 제공 업체를 피할 수 있지만 다른 한편으로 콘텐츠 제공 업체는 앱의 데이터베이스를 변경하려는 경우 삶을 쉽게 만듭니다. 예를 들어 SQLite에서 MangoDB로.
Prashant

116

공개 할 생각이 ContentProvider없더라도 a를 사용하는 것이 확실히 좋은 생각이라고 생각합니다 .

내부적으로 쉽게 변경할 수 있도록 데이터에 대한 추가 추상화 수준을 제공하는 것이 좋습니다. 나중에 기본 데이터베이스 구조를 변경하기로 결정하면 어떻게됩니까? a를 사용하면 ContentProvider그 안에 모든 구조적 변경 사항을 포함 할 수 있습니다. 마치 하나를 사용하지 않는 것처럼 구조적 변경의 영향을받는 코드의 모든 영역을 변경해야합니다. 게다가 데이터베이스에 대한 낮은 수준의 액세스로 코드를 흩 뜨리는 대신 데이터 액세스에 동일한 표준 API를 재사용 할 수 있다는 점이 좋습니다.

또한 미래에 데이터를 노출하고 싶을 가능성이 항상 있습니다. ContentProvider선불을 사용하지 않으면 나중에 다시 장착하기가 훨씬 더 어려울 것입니다.

그런 다음 ContentProviders를 사용할 때 SyncAdapter및 예를 들어 데이터 액세스를 포함하는 앱 위젯을 원하는 경우 와 같이 '가 필요 / 권장되는 Android의 다른 부분이 있습니다.

요약하자면, 미리 작성하는 데 드는 오버 헤드가 매우 적 ContentProvider으므로 (어쨌든 좋은 아이디어 인 API를 배운 후에는) 개인 데이터에 대해서도 그렇게하는 것이 합리적입니다.


1
나는 더 이상 동의 할 수 없었다. 새로운 개발자가 UI를 연결할 수 없도록 실질적으로 보장하는 방식으로 데이터 레이어를 추상화해야합니다.
Gabriel

3
Android를 배우 자마자 바로 이런 이유로 똑같은 생각을하기 시작했습니다. 공개되지 않더라도 추상화가 증가하고 아키텍처 결정의 단일 구현 지점에서 항상 이점을 얻을 수 있습니다. 저는 ContentProviders를 좋아합니다.
davidcsb 2014 년

1
이 속성을 가진 자신의 응용 프로그램에 콘텐츠 제공 업체에만 사용할 수 있습니다 :android:exported="false"
토비 1 케노비

4
제 생각에는 ContentProvider를 구현할 필요없이 완전히 추상화 된 방식으로 데이터를 처리 할 수 ​​있으며 처리해야합니다.
hmartinezd

2
난 내 내부 SQLite는 DB (다른 응용 프로그램과 상호 작용 없음)를위한 컨텐트 프로 솔루션을 구현가는 길에 있었다, 나는에 말 보았다 developer.android.com/guide/topics/providers/... 상태 당신은 공급자가 필요하지 않습니다를 사용이 전적으로 자신의 응용 프로그램 내에서 사용되는 경우 SQLite 데이터베이스를 사용합니다.
Selçuk Cihan

7

Eclipse 용 MOTODEV Studio를 살펴보십시오. Eclipse를 확장하는 개발 환경입니다. 데이터베이스에 대한 콘텐츠 제공자를 자동으로 생성 할 수있는 도구가 있습니다. 콘텐츠 제공자가 데이터에 더 쉽게 액세스 할 수 있고 성능에 큰 영향을 미치지 않는 경우 계속해서 사용하십시오. 대부분의 시나리오에서 이것이 사실입니다.


5

즉, 데이터를 효과적으로 관리하는Content Providers 데 도움이됩니다 . 다음과 같은 이유로 사용하는 것이 좋습니다.

  • UI와 데이터베이스 사이추상화 계층 역할을 합니다 . ContentProviders에서 데이터 유효성 검사 를 구현 하여 사용자가 입력 한 데이터의 유효성을 검사 할 수 있습니다 . 또한 UI 및 기타 부분을 건드리지 않고도 데이터베이스 의 구조수정할 수 있습니다 .
  • 그들은 같은 다른 안드로이드 프레임 워크 클래스 와 잘 어울립니다 SyncAdapter. 예를 들어, ContentProviders와 함께 사용하여 데이터베이스의 값이 변경되면 목록을 자동으로 새로 고칠 수 있습니다 CursorLoader. ContentProviders가 없으면 이와 같은 많은 기능을 직접 구현해야합니다.
  • 개인 데이터를 다른 앱에 안전하게 노출 할 수 있습니다 . ContentProviders를 사용하면 데이터를 다른 앱과 쉽고 안전하게 공유 할 수 있습니다.

따라서 지금 이러한 기능이 필요하지 않더라도 향후에 필요할 수 있으며 추가 작업을 수행하여 지금 바로 구현하는 것이 좋습니다.


좋은 대답입니다. 단일 문장 설명 ContentProviders과이를 사용해야하는 세 가지 별도의 이유. 때로는 간단한 설명이 가장 좋습니다. +1
AdamInTheOculus

4

ContentProviders는 이해하기가 조금 어렵지만 내부적으로 앱을 사용하려는 경우에도 확실히 도움이된다는 데 동의합니다. 가장 좋은 점은 적절한 URI에 대한 콘텐츠 제공 업체를 사용자 지정할 수 있다는 것입니다.

다음은 데이터베이스에 5 개의 테이블이있을 수 있지만 일부를 사용하기 전에 특정 순서로 조인해야하는 시나리오입니다. 그리고 이러한 각 조인에 대한 콘텐츠 URI를 만듭니다. 그런 다음 각각 이러한 URI를 테이블로 사용할 수 있습니다. :)

콘텐츠 제공 업체와 함께 진행하는 것이 좋습니다. 얼마나 강력한 지 놀랄 것입니다.


2

내 관점에서 콘텐츠 제공자는 다른 앱과 데이터를 공유하는 것만으로도 많은 이점을 제공합니다. Sync-Adapter를 사용하여 서버와 동기화해야하는 경우, Google 클라우드 메시징을 사용하고, DB의 기본 데이터가 로더를 사용하여 변경 될 때 UI를 자동 업데이트하고, 검색을 구현하고, 위젯을 사용합니다. 그러면 콘텐츠 제공자가 적합합니다.

언젠가는 콘텐츠 제공 업체에 첨부 된 위 기능 중 일부를 구현해야 할 수도 있으므로에 대한 지침을 따르는 것이 좋습니다.

그런데 콘텐츠 제공자 생성기를 사용하여 5 분 이내에 데이터베이스와 CP를 신속하게 구축 할 수 있습니다.


1

문서에서 말했듯이 : 콘텐츠 제공자 만들기

사용이 전적으로 자체 응용 프로그램 내에서 사용되는 경우 SQLite 데이터베이스를 사용하기 위해 공급자가 필요하지 않습니다.

그렇다면 왜이 오버 헤드를 개발해야할까요? 더 쉽고 빠른 개발을 원하십니까? 따라서 하나의 추상화 계층 (SQLiteOpenHelper 하위 항목)이면 충분합니다.

Occam 's Razor를 참조하십시오 . 정당한 이유없이 엔티티를 만들지 마십시오.


0

다른 앱과 데이터를 공유하지 않으려면 콘텐츠 제공 업체를 사용하지 마세요. 간단한 sqlitedatabase를 사용하여 데이터베이스 작업을 수행합니다. 다른 앱에서 귀하의 기밀 정보에 액세스 할 수 있으므로 기밀 데이터를 저장하기 위해 콘텐츠 제공 업체를 사용할 때주의하십시오.


기본적으로 콘텐츠 공급자는 노출되지 않으며 이에 대한 액세스 제한을 쉽게 관리 할 수 ​​있습니다. 잘못된 정보를 퍼뜨리는 데 반대표를 던집니다.
TBridges42

2
@ TBridges42 당신은 잘못되었습니다. 사실 API 레벨 17 콘텐츠 제공자가 노출 되기 전까지 . 그리고 답변 당시에는 Android 기기의 25 % 가이 동작의 영향받았으며 댓글 작성 시점에는 여전히 10 %였습니다 . 따라서 그것은 그 반대입니다. 사실이 아니거나 사실이 아닌 보안해야 할 것을 진술하기 때문에 귀하의 의견은 위험합니다.
Murmel

0

콘텐츠 제공 업체를 사용하면 추가적인 추상화 수준에 도움이 될 수 있습니다. 자체 애플리케이션에 콘텐츠 제공 업체를 배치하면 프로젝트에 상당한 개발 시간이 추가됩니다. 그러나 여러 응용 프로그램에서 데이터, 응용 프로그램 설정 또는 구성을 공유하는 데 사용하는 경우 콘텐츠 제공자가 선택합니다.

보안 수준을 확인하고 콘텐츠 제공자가 SQLite에 쓰는 경우 SQLcipher를 사용하여 재설정시 데이터 (DAR)를 암호화하는 것이 좋습니다. (저는 몇 가지 솔루션에서 콘텐츠 제공 업체를 사용했으며 디버깅 및 테스트를 위해 운영 값을 실시간으로 "스냅 샷"할 수있는 기능을 제공했습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.