2011-09-06 4 views
2

contentprovider의 기능에 ReadWriteLock을 사용해야합니까?Android contentprovider lock

contentProvider의 쿼리에서 필자는 getReadableDatabase를 실행 한 다음 열려 있는지 확인하고 쿼리를 수행합니다. 그러나 DatabaseIsClosed 예외에서 충돌하는 경우가 있습니다. 이것은 다른 프로세스가 첫 번째 프로세스를 닫는 getWritebleDatabase를 수행하는 삽입 작업을 수행 할 수 있습니다.

나는 contentprovider에 쿼리하고 삽입하는 앱과 서비스를 사용하고 있습니다. 그래서 그것은 contentprovider가 threadsafe하지 않은 것 같습니다.

기능을 동기화하는 데 도움이 될 수 있습니까?

감사합니다.

답변

1

getReadableDatabase를 수행 한 contentprovider의 쿼리에서 열려 있는지 확인한 다음 쿼리를 수행하십시오. 그러나 때로는 DatabaseIsClosed exeption에서 충돌이 발생합니다. 다른 프로세스가 첫 번째 프로세스를 닫는 getWritebleDatabase를 수행하는 삽입 작업을 수행 할 수 있습니다.

AFAIK (ContentProvider)의 평생 동안 데이터베이스를 열어 두어야합니다.

그래서 contentprovider는 threadsafe가 아닙니다.

AFAIK, ContentProvider은 한 스레드에서만 호출됩니다.

ContentProvider은 본질적으로 스레드 안전성을 제공하지 않습니다.

+0

[AlarmProvider] (http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2.1_r1/com/android/alarmclock) /AlarmProvider.java#AlarmProvider) 모든 삽입/쿼리/업데이트에 대해 읽기/쓰기 가능한 새 데이터베이스를 가져옵니다. 내가하는 것처럼. 하지만 그들은받은 데이터베이스를 닫지 않습니다. 이것은 불안정해야하지만, 우리는 더 자주 AlarmProvider를 질의하고 삽입한다고 생각합니다. –

+0

@CommonsWare에서 대답을 업데이트하고 싶을 수도 있습니다. ContentProvider는 [documentation] (http://developer.android.com/reference/android/content/ContentProvider)에 따라 많은 스레드에서 동시에 호출 할 수 있습니다. html). 공정하게하기 위해, 나는 이것이 지난 9 월에 매우 분명한 방법이라고 생각하지 않는다. :) –

+0

@AlexLockwood : 그렇습니다. 왜 'ContentProvider'를 사용했는지에 대한 초기 주장 중 하나는 그것이 제공 한 스레드 안전성이었습니다 ... 그렇진 않습니다. 결함있는 답변을 지적 해 주셔서 감사합니다! – CommonsWare