“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.