android - sqlite
*SQLiteDatabase:open, close 관련
SQLiteOpenHelper 생성에 필요한 context는 현재 context와 달라도 static 변수 instance 받기 가능
*ERROR: attempt to re-open an already-closed object
여러 thread에서 동시에 db작업하는 경우, 한 connection을 사용해야 한다
이 때 각각의 thread에서 (SQliteDatabase 변수)db.close()를 호출하는 경우,
한 connection의 getInstance()는 같은 instance반환하기 때문에 생김.
참고: http://aroundck.tistory.com/2781
(나는 db.close를 따로 호출하지 않았지만 저런 에러가 생기는 것을 보니 시스템에서 close를 처리해주나보다)
-해결방안: synchronized method를 이용
public synchronized void getA(){
}
public void getA(){
synchronized (this){
...
}
}
멀티스레드 환경에서 동시에 진입 불가->여러 스레드가 하나의 instance에 대해서 (this를 사용하는) 메소드를 수행할 때 진입이 불가하지만, 스레드 각각 다른 instance의 메소드 는 실행 가능
*synchroized method로 실행해도 위와 같은 에러 또 발생
특히 searchView에서 다른 문자열은 상관 없는데 '가'를 입력하자마자 에러발생
clean build를 해도 무소용
-해결방법: 앱을 켤때 db.open, 끌 때 db.close 한번씩만 허용하기
/** For OPEN database **/
public synchronized DatabaseHelper open() throws SQLiteException {
dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
return this;
}
/** For CLOSE database **/
public void close() {
dbHelper.close();
}
*위 해결방법 안된 이유:
app이 꺼진다고 해서 onDestroy메서드를 호출하는 것이 아니다
나는 저 메소드 안에 close()를 호출했기 때문에 앱을 꺼도 close되지 않았고, 앱을 켤 때마다 close()처리 되지않은 db를 open()했기 때문에 에러 발생
해결방법:onDestroy()메서드에서 close()호출
SQLiteOpenHelper 생성에 필요한 context는 현재 context와 달라도 static 변수 instance 받기 가능
*ERROR: attempt to re-open an already-closed object
여러 thread에서 동시에 db작업하는 경우, 한 connection을 사용해야 한다
이 때 각각의 thread에서 (SQliteDatabase 변수)db.close()를 호출하는 경우,
한 connection의 getInstance()는 같은 instance반환하기 때문에 생김.
참고: http://aroundck.tistory.com/2781
(나는 db.close를 따로 호출하지 않았지만 저런 에러가 생기는 것을 보니 시스템에서 close를 처리해주나보다)
-해결방안: synchronized method를 이용
public synchronized void getA(){
}
public void getA(){
synchronized (this){
...
}
}
멀티스레드 환경에서 동시에 진입 불가->여러 스레드가 하나의 instance에 대해서 (this를 사용하는) 메소드를 수행할 때 진입이 불가하지만, 스레드 각각 다른 instance의 메소드 는 실행 가능
*synchroized method로 실행해도 위와 같은 에러 또 발생
특히 searchView에서 다른 문자열은 상관 없는데 '가'를 입력하자마자 에러발생
clean build를 해도 무소용
-해결방법: 앱을 켤때 db.open, 끌 때 db.close 한번씩만 허용하기
/** For OPEN database **/
public synchronized DatabaseHelper open() throws SQLiteException {
dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
return this;
}
/** For CLOSE database **/
public void close() {
dbHelper.close();
}
*위 해결방법 안된 이유:
app이 꺼진다고 해서 onDestroy메서드를 호출하는 것이 아니다
나는 저 메소드 안에 close()를 호출했기 때문에 앱을 꺼도 close되지 않았고, 앱을 켤 때마다 close()처리 되지않은 db를 open()했기 때문에 에러 발생
해결방법:onDestroy()메서드에서 close()호출
댓글
댓글 쓰기