“Content-Provider”와“SQLite Database”의 정확한 차이점


87

저는 Android 용 SQLite 데이터베이스 프로그래밍을 해봤지만 Content-Provider에 대해서는 다음을 제외하고는 아무것도 모릅니다. " Android 개발자 페이지를 참조 했으므로 Android SDK는 데이터를 저장하고 검색하는 데 사용되는"Content-provider "에 대해 설명했습니다."

하지만,

  1. "Content-Provider"와 "SQLite Database"의 정확한 차이점은 무엇입니까?
  2. 언제 데이터를 저장하는 것이 가장 좋습니까?

어떤 예나 도움이 !!

답변:


134

다음과 같은 주요 차이점을 발견했습니다.

데이터를 데이터베이스에 저장하는 것은 데이터를 유지하는 좋은 방법 중 하나 이지만 Android에서 생성 된 Android 데이터베이스는 visible해당 데이터를 생성 한 애플리케이션에만 해당된다는 경고가 있습니다. 즉, 한 애플리케이션에서 Android에서 생성 한 SQLite 데이터베이스는 다른 애플리케이션이 아닌 해당 애플리케이션에서만 사용할 수 있습니다.

그래서 만약 당신이 need to share data between applications, you need to use the content provider model as recommended in Android. 기사에서는 컨텐츠 제공자의 기본 사항과이를 구현하는 방법을 설명합니다.

이 링크 에서이 기사를 찾았습니다.

정말 좋은 정보가 제공되었습니다.


2
링크가 이제 죽은 것 같습니다 ... 더 이상 기사를 볼 수 없습니다. 참조중인 기사를 다시 찾으면보고 싶습니다.
— prolink007 2012 년

2012 년 2 월 11 일에 링크 http://www.devx.com/wireless/Article/41133 작동,
— k3b

스레드로부터 안전한 방식으로 여러 애플리케이션에서 데이터를 공유하는 프로세스에 메커니즘을 제공하면 어떻게 될까요?
— Manohar 2012

2
또 다른 추가 장점은 콘텐츠 제공은 그럼 여러 스레드가 sqlite가 경우처럼 데이터베이스를 수정할 수 없습니다, 모든 작업에 대한 단일 스레드를 사용하는 것입니다
— 라따뚜이을 두드리는-A-TAT

54

"Content-Provider"와 "SQLite Database"의 정확한 차이점은 무엇입니까?

ContentProvider다른 프로세스에 데이터베이스를 노출하는 구현할 수있는 API입니다. 그것은 할 수 있습니다 데이터가 SQLite 데이터베이스에 저장되는 방식으로 구현 될 수 있지만 그럴 필요하지 않습니다.

언제 데이터를 저장하는 것이 가장 좋습니까?

초록에서 대답하기는 불가능합니다. 일반적으로를 사용해야하는 경우가 아니라면 ContentProvider데이터베이스를 사용하십시오.


26
SQL보다 매우 좋은 추상화이므로 ContentProvider를 사용하는 것을 선호합니다. CursorAdapter 및 자동 요청으로 멋지게 재생할 수도 있습니다.
— alexanderblom 2010-07-28

26

저는 단순히 SQLite 메서드를 사용하는 수천 명의 사용자가 사용하는 좋은 앱을 많이 만들었습니다. 그러나 그것은 얼마 전이었고 이제는 ContentProvider가 쉽게 처리 할 수있는 많은 코드를 수동으로 작성해야했습니다. 그 당시에는 코드에 복잡성 만 추가하는 것처럼 보였기 때문에 콘텐츠 제공 업체를 사용하는 것을 선호하지 않았습니다.

그러나 지난 몇 년 동안 Android가 발전함에 따라 시간을 절약하고 더 많은 일을 할 수있는 ContentProvider로 이동했습니다. 나는 지금 그것을 광범위하게 사용합니다. 콘텐츠 제공자 클래스를 작성하면 생활이 훨씬 쉬워집니다. ContentProvider를 사용하면 과거에 모든 것을 수동으로 작성해야했지만 여전히 효율적으로 작동하지 않는 커서 로더, 로더 콜백 및 대량 삽입을 훨씬 쉽게 처리 할 수 ​​있습니다. 특히 하나의 notifychange () 메서드 덕분에 이제 자동으로 업데이트되는 목록보기를 업데이트 할 때. 즉, 이제는 내 리스너를 입력하고 목록보기 및 어댑터에서 콘텐츠를 수동으로 업데이트 할 필요가 없습니다. 또한 데이터베이스를 열고 닫는 것에 대해 걱정하거나 메모리 누수에 대해 걱정할 필요가 없습니다. 그것은 모두 콘텐츠 제공자가 처리합니다. 가끔 내가 직면하는 유일한 문제는 ContentProviders에서 복잡한 쿼리를 수행 할 수 없다는 것입니다. 이 경우에도 여전히 원시 쿼리를 사용하고 sqlite와의 구식 수동 상호 작용을 사용할 수 있습니다.

이전에 자신의 DbAdapter, Helper 및 Observer를 작성한 경우 모든 것을 ContentProvider로 변환하는 데 시간을 소비하지 않고도 새 앱으로 안전하게 이동할 수 있습니다. 그러나 내 경험을 바탕으로 ContentProvider로 이동하는 것이 좋습니다. 익숙해지는 데는 시간이 좀 걸리 겠지만 일단 경험이 쌓이면 그대로있을 것입니다.

UPDATE 2017 이제 모든 플랫폼에서 데이터베이스를 사용하는 훨씬 더 나은 방법 인 Realm으로 전환했습니다 . 몇 시간 동안 배우고 앱 개발 경력에서 수많은 시간을 절약하십시오.


내 코드를 콘텐츠 제공 업체로 변환 할 생각 이었지만 지금은 유지하려고합니다.
— Mohammed Subhi Sheikh Quroush

이제 Android의 'Room'라이브러리를 추가 할 수도 있습니다
— Ravindra Kushwaha

8

1. 콘텐츠 제공자는 스레드로부터 안전하지 않습니다.

기본적으로 콘텐츠 공급자는 스레드로부터 안전하지 않습니다. 콘텐츠 제공 업체를 사용하는 여러 스레드가있는 경우 다양한 예외가 발생하고 기타 데이터 불일치가 발생하는 것을 볼 수 있습니다. 이 문제를 해결하는 가장 쉬운 방법은 콘텐츠 공급자가 노출하는 각 공용 메서드에서 동기화 된 키워드를 사용하는 것입니다.

이런 식으로 한 번에 하나의 스레드 만 이러한 메서드에 액세스 할 수 있습니다.

2. 많은 글을 쓸 때 멋지게 플레이

새로운 Serval Maps 애플리케이션에서 바이너리 파일의 데이터를 애플리케이션에서 내부적으로 사용하는 데이터베이스로 가져올 필요가 있습니다. 이 작업을 수행하고 나머지 응용 프로그램을 잘 활용하려면 다음을 수행하는 것이 가장 좋습니다.

가져 오기를 수행 할 새 스레드를 생성하여 다른 스레드, 특히 UI 업데이트를 담당하는 스레드에 악영향을 미치지 않도록합니다. 그리고 동기화 된 메서드를 더 많이 사용해야하는 다른 스레드를 제공하기 위해 각 가져 오기가 끝날 때 잠시 일시 중지합니다.

3. 콘텐츠 제공자는 때때로 옆으로 생각하도록 강요합니다.

Android의 콘텐츠 제공 업체가 작동하는 방식은 나머지 코드와 기본 데이터베이스간에 추상화 계층을 제공하는 것입니다. 이것은 주로 콘텐츠 제공자가 데이터베이스가 아닌 다른 곳에서 데이터에 액세스 할 수 있다는 사실에 기인합니다.

즉, 기본 데이터베이스에서 원시 SQL 쿼리를 실행할 수 없으며 쿼리 메서드와 같은 다양한 메서드에 전달 된 변수를 사용하여 SQL 쿼리의 다양한 구성 요소를 지정해야합니다. 콘텐츠 공급자가 SQL을 처리하는 방식에 맞지 않는 작업이있는 경우 두 가지 옵션이 있습니다.

쿼리에 대해 옆으로 생각해보십시오. 대체 쿼리를 통해 필요한 데이터를 얻고 커서에서 결과에 액세스 할 수 있습니다. 데이터에 정상적으로 액세스하려면 URI를 사용하고 대안이없는 작업에 대해서는 특정 쿼리와 일치하는 특수 URI를 사용합니다.


에 따라 컨텐트 프로 한 번에 여러 스레드에서 호출 할 수있는 구현해야하는 컨텐트 프로의 여섯 개 추상 메소드는, 그래서 그들은 스레드 안전으로 구현해야합니다. 추상 클래스 ContentProvider는 특정 코드의 예외 이유가 아니라 구현입니다. ContentProvider의 스레드 안전 메서드를 구현하려면 프로세스 및 스레드 를 따릅니다 .
— StahlRat

5

콘텐츠 공급자는 응용 프로그램간에 데이터를 공유하려는 경우에 사용됩니다.

응용 프로그램과 연결된 데이터베이스가 있고 다른 응용 프로그램에서 일부 데이터를 사용하도록하려면 데이터를 노출하는 콘텐츠 공급자를 구현할 수 있습니다.


3

주요 차이점은 앱이 다른 앱과 정보를 공유해야하는 경우 Content-Provider를 사용한다는 것입니다. 생성 한 앱에 대한 SQLite 전용 스토리지 데이터


3

나는 같은 의심을 찾으 면서이 대답 을 읽었 으므로 그것을 공유하는 것을 생각했습니다. 그것은 말한다-

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

따라서 콘텐츠 제공 업체를 사용하는 것이 좋습니다.


3

고급 콘텐츠 관리 시스템을 생각해보십시오. 각 개체 (페이지, 이미지, 뉴스 기사, 이벤트 항목 등)에는 콘텐츠, 주소, 사용자 권한 및 시스템의 다른 부분에서 상호 작용하는 방법이 있습니다. 콘텐츠 제공자는 Android를 위해 그렇게합니다. 이제 응용 프로그램에 저장 한 파일이나 이미지를 공유 할 수 있습니다. 비즈니스 연락처, 편집 가능한 메모 등과 같은 사용자 지정 공유 가능 개체를 만들 수도 있습니다. 다른 응용 프로그램에서 열 때 이러한 개체를 처리 할 보안 및 기본 응용 프로그램을 지정할 수도 있습니다.


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