SQLiteAssetHelper NullPointerException только на некоторых устройствах

Я использую библиотеку SQLiteAssetHelper для работы с моими операциями в App DB, и она работает нормально почти для каждого телефона, с которым я тестировал. Однако некоторые пользователи с Android 2.3.3 – 2.3.7 сообщают о сбоях при вызове, чтобы открыть db. Я подозреваю, что это связано с некоторыми проблемами, возникающими в первый раз, когда db копируется из папки с ресурсами (например, недостаточно места во внутреннем хранилище).

Класс помощника:

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 секунд, если db не может быть открыт):

 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) 

Solutions Collecting From Web of "SQLiteAssetHelper NullPointerException только на некоторых устройствах"

Возможно, пользователи очистили хранилище или у них нет SD-карты?

Вероятно, что происходит для спорадических аварий.

** Внедрили ли вы методы oncreate и onupgrade?

Я использую открытый помощник. Поэтому у меня никогда не было проблем с открытием базы данных.

  public class RidesDatabaseHandler extends SQLiteOpenHelper { 

  // Creating Tables @Override public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_RIDES + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_DESCRIPTION + " TEXT," + KEY_BOUNDS_NELAT + " TEXT," + KEY_BOUNDS_NELONG + " TEXT," + KEY_BOUNDS_SWLAT + " TEXT," + KEY_BOUNDS_SWLONG + " TEXT," + KEY_RESRAWID + " TEXT," + KEY_RESDRAWABLEID + " TEXT," + KEY_PATH + " TEXT," + " CONSTRAINT UNQ_" + KEY_PATH + " UNIQUE (" + KEY_PATH + ") ON CONFLICT ABORT)"; // VERSION 43 ADDS THE KEY_DATE_UPDATE COLUMN CREATE_CONTACTS_TABLE += " , " + KEY_DATE_UPDATE + " INTEGER DEFAULT 0"; db.execSQL(CREATE_CONTACTS_TABLE); } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { int upgradeTo = oldVersion + 1; while (upgradeTo <= newVersion) { switch (upgradeTo) { // update old resrawid's to constants // this was caused when I saved R values in the database // and then later realized they would change. // the old resrawid is changed to a constant. case 42: ContentValues values; @SuppressWarnings("unused") // used for debugging so I can see the value of the update. int res; int rs; rs = 2130968576; values = new ContentValues(); values.put( KEY_RESRAWID, com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_DRAGON); res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", new String[] { String.valueOf(rs) }); rs = 2130968577; values = new ContentValues(); values.put( KEY_RESRAWID, com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_M119); res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", new String[] { String.valueOf(rs) }); rs = 2130968578; values = new ContentValues(); values.put( KEY_RESRAWID, com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_MEDINA); res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?", new String[] { String.valueOf(rs) }); break; case 43: // new column added for last_viewed. db.execSQL(VERSION_43_ALTER); break; case 44: // new index on KEY_DATE_UPDATE DESC db.execSQL(VERSION_44_CREATE_INDEX); } upgradeTo++; } 

Удачи

У этого вопроса не было принятого ответа, хотя ОП указал, что он был решен в комментариях. Итак, вот ответ:

Не пытайтесь скопировать базу данных с помощью AsyncTask , вызываемой из метода (например, onCreate ), а затем попытайтесь заполнить ListView данными из базы данных одним и тем же методом. Если AsyncTask не закончил к тому времени, когда ListView нуждается в данных, тогда будет AsyncTask NullPointerException.

Вместо этого заполните ListView из метода onPostExecute для AsyncTask . Это обеспечит завершение копирования базы данных.