2012-09-16 4 views
1

이 질문은 내가 읽은 많은 사람들과 매우 비슷하지만 다시 만족할만한 코드는 찾지 못했습니다. (또는 나는 그것을 깨닫기에는 너무 졸음다.)안드로이드에서 단일 데이터베이스 연결 유지

나는 그 중 하나만 존재하도록 싱글 톤 데이터베이스 도우미를 가지고있다. 문제는 여기에 없습니다. getReadableDatabasegetWritableDatabse 메쏘드를 사용하면서 단 하나의 데이터베이스 연결 만 존재하게 할 때 문제가 발생합니다.

대부분의 경우 동일한 참조를 반환하며 사용을 처리 할 수 ​​있지만 읽기 전용 연결이 열려있는 경우 (메모리가 부족한 경우) 및 다른 스레드 쓰기 가능한 연결을 열려고합니다. 읽기 전용 연결이 닫히고 쓰기 가능한 연결을 열려고 시도 할 때까지 쓰기 스레드를 차단하고 싶습니다.

어떻게 하시겠습니까? 아마도 Java에서 일부 스레드 잠금만으로는 수행 할 수 있지만 어떤 메소드를 사용해야하는지는 확실하지 않습니다.

P. 내가 뭔가를 놓친 경우를 대비해 다른 방법으로 어떻게해야하는지 나와 함께 보여주십시오.

+0

'메모리 부족 '?? DB의 크기는 얼마입니까? – Lucifer

+1

몇 주 전에 같은 질문을 받았고 콘텐츠 공급자를 구현했습니다. 과잉인가요? 같은 응용 프로그램 내에서만 데이터에 액세스 할 수 있기 때문입니다. 하지만 SQLite 데이터베이스에 액세스하는 데있어 합병증을 추상화하는 방법을 좋아합니다. 또한 로더와도 잘 작동합니다. –

+0

@ 루시퍼, 내 응용 프로그램은 결코 메모리를 사용하는 유일한 응용 프로그램입니다. – Pijusn

답변

1

나는 과거에 똑같은 문제를 겪었으며 동기가 답이다. 간단히 말해 databasehelper 인스턴스에서 동기화하십시오. 또는 getWritableDatabase에 대한 래퍼 메서드를 만들고 메서드 선언에서 synchronized 키워드를 사용할 수 있습니다. 그런 다음 getReadableDatabase를 호출하지 말고 래퍼 메소드 만 호출하십시오. getReadableDB와 getWritableDB는 동일한 참조를 제공하므로 안전하게 수행 할 수 있습니다. 이해가 되니?

+0

그래, 나는 그것에 대해 생각하고 있었고 그 일은 빠른 해결 방안으로했지만 나는'getReadableDatabase'를 사용하지 않고 대부분의 경우에 성공할 것이라고 생각했다. 내 응용 프로그램은 거의 쓰지 않고 많은 독서를합니다. 즉, 충돌 할 수도 있지만'getReadableDatabase'를 사용하면 메모리가 부족할 수도 있습니다. – Pijusn