2011-02-10 3 views
3

모두 learn 데이터베이스 연결과 같은 리소스는 늦게 수집되어 조기에 릴리스되어야합니다.한 스레드에서 SQLite 데이터베이스를 닫으면 다른 스레드에서 열린 데이터베이스가 깨집니다.

그러나 Android에서 SQLite 데이터베이스 연결에이 원칙을 적용하면 나에게 두통이 생깁니다.

정기적으로 데이터베이스에 업데이트를 작성하여 백그라운드에서 작동하는 서비스의 백엔드 서버에서 업데이트를 다운로드하는 앱이 있습니다. 나는 다음과 같은 순서가 발생했을 때 발생하는 경험 문제는 :

  1. 서비스는 쓰기 가능한 데이터베이스 연결 일부 활동이 읽을 수있는 데이터베이스 연결을 엽니 다
  2. 에게 개방
  3. 서비스 활동 데이터를 읽는
  4. 와 동시에 데이터베이스 연결 종료
  5. 데이터베이스 연결이 닫혀 활동이 실패했습니다.

서비스와 액티비티는 서로 다른 인스턴스를 사용하여 동일한 연결을 열기 위해 동일한 SQLiteOpenHelper 클래스를 사용합니다. 필자의 초기 가정은 이것이 정상적으로 작동해야했지만 어떻게 든 기본 연결이 두 데이터베이스 인스턴스간에 공유되는 것 같습니다.

문제를 해결하려면을 닫지 않고 열려있는 커서 만 닫으면서 이 종료되었습니다. 이것은 내가 여기에 기억을 새기고 있지 않다는 것을 확신하지 않지만 작동하는 것으로 보인다.

여기에 분명한 내용이 있습니까?

+0

"동시에"는 무엇을 의미합니까? 서비스가 백그라운드 스레드로 실행되고 있습니까? –

+0

@Graham : 그렇습니다. 언급했듯이, 서비스가 작동하는 것은 별도의 스레드에서 백그라운드에서 작업하고 있습니다. –

+0

그리고 예, 동시에 "동시에"를 의미합니다. –

답변

1

여기에 분명한 내용이 있습니까?

아니요. SQLiteOpenHelper 소스 코드를 보면 두 인스턴스가 SQLiteDatabase 개체를 공유하는 방법을 알 수 없습니다.

일부 진단 제안 :

  • 당신에게 자바 인스턴스 ID를 제공해야 각 SQLiteDatabasetoString() 값을 덤프합니다. 동일하다면 문제가있는 곳이며, 실제로 일어난 일을 파악하려면 업스트림으로 작업해야합니다 (예 : 실제로 SQLiteOpenHelper의 동일한 인스턴스를 사용하는 경우).
  • 데이터베이스가 안정된 상태 (즉, 생성 또는 업그레이드 할 필요 없음) 인 경우 SQLiteOpenHelper이 아닌 SQLiteDatabase을 직접 사용하고 두 변경 사항이 중요한지 확인하기 위해 두 데이터베이스 장소 중 하나를 전환하십시오.
+0

입력 해 주셔서 감사합니다. 인스턴스를 삽입하는 데 roboguice를 사용하고 있기 때문에 roboguice가 실제로 종속성마다 고유 한 인스턴스를 제공한다고 주장하는 테스트를 수행했습니다. 필자가 제안한대로'SQLiteOpenHelper'와'SQLiteDatabase'로 더 고립 된 테스트를 시도 할 것입니다. –

관련 문제