내 안드로이드 응용 프로그램에 SOA 아키텍처를 사용하고 있습니다. 저는 백그라운드에서 (1 분마다) MYSQL 데이터베이스에서 데이터를 가져 와서 SQLite 데이터베이스와 동기화합니다 (2 개 데이터베이스에 변경 사항이있는 경우).SQlite : 데이터베이스 잠김 오류
이제 서비스가 백그라운드에서 실행될 때 SQLite가 열립니다. 동시에 (사용) 응용 프로그램을 처리하는 경우 Sqlite를 열어 데이터를 가져 오려고 시도합니다. 이 경우 다음과 같은 오류가 발생합니다. 데이터베이스가 android.database.SQLiteOpenHelper.getReadableDatabase에 잠겨 있습니다.
아무도 제발 이런 종류의 상황에서 할 수있는 제안을 할 수 있습니까?
귀하의 제안에 따르면, 나는 이런 식으로 DatabaseHelper (래퍼 클래스)의 단일 인스턴스를 만들었습니다 : private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper (컨텍스트 컨텍스트) { if (instance == null) 인스턴스 = 새 DatabaseHelper (컨텍스트); return instance; 내가 DatabaseHelper의 방법을 사용해야 할 때마다 } 지금 내가 follws로 전화 : \t \t DatabaseHelper dB = DatabaseHelper.getHelper (이); \t BaseObject bObj = db.GetObjectFromDB ("GlobalObject1"); – Neha
이제 GetObjectFromDB는 DatabaseHelper의 메서드입니다.이 메서드는 Sqlite DB에서 데이터를 읽습니다. DB에 액세스하려면이 방식으로 처리해야합니다. \t SQLiteDatabase db = this.getReadableDatabase(); 이전에 말한 것처럼 내 응용 프로그램은 많은 스레드를 실행합니다. 내 스레드 중 하나가 DB에 액세스하면 다른 스레드도 동일한 메소드 GetObjectFromDB를 사용하여 DB에 액세스하려고 시도합니다. 내 문제는 getReadableDatabase() 항상 새 DB 연결을 엽니 다. 이 조건을 어떻게 극복 할 수 있습니까? 감사합니다. Neha – Neha
안녕 모두, 내 질문에 대한 답변을 얻었습니다. 나는 래퍼 클래스 인 DataBasehelper의 정적 인스턴스와 SQLiteDatabase의 정적 인스턴스를 만들었습니다. private static DatabaseHelper instance; 개인 정적 SQLiteDatabase sqlitedb = null; 공개 동기화의 SQLiteDatabase getHelper() { 경우 (sqlitedb == NULL) { sqlitedb this.getWritableDatabase =(); } else if (sqlitedb.isOpen() == false) { sqlitedb = this.getWritableDatabase(); } return sqlitedb; } 이제 DB를 다음과 같이 호출합니다. SQLiteDatabase db = this.getHelper(); – Neha