私のAppDB操作に対処するためにSQLiteAssetHelperライブラリを使用しています。テストしたほぼすべての電話機で正常に動作しています。しかし、Android 2.3.3 - 2.3.7のユーザーの中には、データベースを開くための呼び出しが行われたときにクラッシュするものがあります。これは、データベースが資産フォルダからコピーされて初めて(内部ストレージのスペース不足など)何らかの問題が発生したためです。SQLiteAssetHelper一部のデバイスでのみNullPointerExceptionが発生しました
ヘルパークラス:
public class DbHelper extends SQLiteAssetHelper {
final static String DB_NAME="db";
static final int DB_VERSION = 1307181213;
final Context context;
public DbHelper(Context c) {
super(c, DB_NAME, null, DB_VERSION);
this.context = c;
setForcedUpgradeVersion(DB_VERSION);
}
}
ハンドラ・クラス(デシベルを開くことができない場合、私は10秒後にタイムアウトするカウンタを設定) :
public class DbHandlerDao {
private SQLiteDatabase database;
private DbHelper dbHelper;
public DbHandlerDao(Context context) {
dbHelper = new DbHelper(context);
}
public void open() throws SQLException {
boolean opened = false;
int timeout = 0;
while (!opened && timeout < 10000) {
try {
database = dbHelper.getReadableDatabase();
opened = true;
}
catch (IllegalStateException e) {
timeout += 500;
try {
Thread.sleep(500);
} catch (Exception e2) {
}
}
}
}
public void close() {
dbHelper.close();
}
呼び出すクラス:
private class DbAsyncTask extends AsyncTask<Long, Void, Void> {
//...
@Override
protected Void doInBackground(Long... params) {
dataHandler.open();
例外:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:180)
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
at com.example.DbHandlerDao.open(DbHandlerDao.java:25)
at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:244)
at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
Android 4.3および4.4を実行している複数の端末で同じバグが表示されています。奇妙なことは、一貫して再現できないということです。 – Ben
githubプロジェクト自体に問題として投稿しています。ほとんどの場合、ライブラリの問題であることが保証されています。標準のSQLiteOpenHelperにはこの問題はありません。他の人もこの問題を抱えているようです:https://github.com/jgilfelt/android-sqlite-asset-helper/issues/23 – anddev84
ありがとう、良いアイデア。しかし、もう少し調査した後、私はこれが自分の間違いであることに気付きました。長い話をするには、アクティビティの 'onCreate'メソッドから呼び出された' AsyncTask'でデータベースをコピーしていましたが、そのデータベースは同じデータベースを使って 'ListView'にポピュレートしようとしました。それは、私が運が良かったときに働いただけで、バックグラウンドタスクは、 'ListView'がデータベースを必要とする前に終了しました! – Ben