2016-07-27 2 views
0

내 sqlite 데이터베이스를 처리하기 위해 SQLiteOpenHelper을 사용하고 있습니다.다중 스레드 다중 sqlite 명령 안드로이드 오류

간단한 asynctask를 사용하여 백그라운드에서 엄청난 양의 데이터베이스 명령을 수행하려고하는데, 사용자가 주 스레드에 줄 지연을 알지 못합니다. 여러 개의 (많은 양의) 명령이있을 때 나는 항상 데이터베이스를 열 수 없습니다.

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) os_unix.c:31278: (24) open(/data/user/0/com.locomain.app/databases/app.db-journal) 

명령을 약간 호출 할 때 발생하지 않습니다.

나는이 문제와 관련된 다른 스레드를 이미 확인했으며 일부 Google 검색도했지만 anwser를 찾을 수 없었다.

내 코드 :

public void addTag(Tag tag){ 
    final SQLiteDatabase db = getWritableDatabase(); 
    final ContentValues values = new ContentValues(1); 
    db.beginTransaction(); 

    values.put(TagColumn.TAG_NAME,tag.getName()); 

    db.insert(TagColumn.TABLE_NAME,null,values); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 
+0

다른 파일이 이미 열려 있습니다. 도우미 클래스의 인스턴스가 2 개입니까? 이 문제를 방지하기 위해 일반적으로 클래스를 싱글 톤으로 만드는 것이 가장 좋습니다. –

+0

아니요, 그것의 싱글 톤 – locomain

답변

-1

가 DB synchronized를 사용하여 방법을 확인하십시오.

어쨌든 더 나은 실용적인 AsyncTasks 대신 스레드를 사용해보십시오.

거래를 사용 하시겠습니까? 정말 삽입 속도가 느려집니다.

+0

나는 SQLiteOpenHelper 자체를 동기화 시켰습니다. 하지만 안드로이드 지침에 따르면 스레드에 대해 asynctask를 사용해야한다고 명시되어 있습니까? 이 원시 쿼리를 수행하는 더 빠른 방법은 무엇입니까? – locomain

+0

이 문제는 AsyncTask에 포함 된 작업에 대한 암시 적 참조가 있음을 나타냅니다. 구성 변경이 발생하면 AsyncTask를 시작한 Activity 인스턴스는 파괴되지만 AsyncTask가 완료 될 때까지 GCd는 삭제되지 않습니다. 스레드가 더 빠르지는 않습니다. 그리고 스레드 대신 AsyncTask를 사용하면 어떤 이점도 없지만 비슷하지만 스레드가 더 안정적입니다. – DEADMC