2016-07-27 13 views
0

私はsqliteデータベースを処理するためにandroid 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検索も行っていますが、アンサーを見つけることができませんでした。

私のコード:

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

デシベル​​を使用し、あなたの方法を確認します。

代わりに、AsyncTasksの代わりにスレッドを使用してください。これはとにかく実用的です。

トランザクションを使用してもよろしいですか?それは本当にあなたの挿入を遅くします。

+0

私はSQLiteOpenHelper自体を同期させました。しかし、アンドロイドのガイドラインによれば、スレッドよりもasynctaskを使うべきだと述べています。この生のクエリをより速く行う方法は何でしょうか? – locomain

+0

この問題は、AsyncTaskが、囲むアクティビティへの暗黙の参照を持っていることが原因です。構成の変更が発生した場合、AsyncTaskを開始したActivityインスタンスは破棄されますが、AsyncTaskが終了するまでGCdは破棄されます。スレッドはそれを速くしません。スレッドの代わりにAsyncTaskを使用する利点はありません。類似していますが、スレッドはより安定しています。 – DEADMC

関連する問題