У меня есть приложение, которое использует базу данных SQL.Это инкапсулируется классом SQLiteOpenHelper.Когда запускается заставка, он вызывает init для класса DataProvider, который хранит защищенный статический экземпляр SQLiteOpenHelper.init просто вызывает конструктор SQLiteOpenHelper:
public class UKMPGData extends SQLiteOpenHelper
{
public UKMPGData(Context context, String databaseName)
{
super(context, databaseName, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
//create table and set up triggers etc
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
onCreate(db);
}
}
public class UKMPGDataProvider
{
protected static UKMPGData uKMpgData;
public static void init(Context aApplicationContext, String aDatabaseName)
{
uKMpgData = new UKMPGData(applicationContext, databaseName);
}
public static void close()
{
uKMpgData.close();
}
}
Затем у меня было два дополнительных класса, которые расширили UKMPGDataProvider и поэтому имели доступ к uKMpgData.Эти классы извлекают и хранят определенные типы данных из базы данных.Например,
public class VehicleDataProvider extends UKMPGDataProvider
{
public static Cursor getVehicles()
{
Cursor cursor = null;
SQLiteDatabase db = uKMpgData.getReadableDatabase();
cursor = db.query(VEHICLE_TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY);
return cursor;
}
//...
}
Все это работало нормально, пока я не заметил, что если приложение работало, а затем переходило в фоновый режим, если оно оставлялось на несколько часов, когда приложение возвращалось вна переднем плане я получил бы нулевой указатель в классе Activity, который вызвал getVehicles () (см. выше).Оказывается, uKMpgData больше не ссылался на объект.
Я понимаю, что Android может завершать процессы, когда это необходимо, но не понимаю, что случилось с моим приложением, чтобы получить нулевой указатель - если мое приложениепроцесс был убит, тогда не будет ли запущен новый экземпляр приложения?Другими словами, новый SplashScreen инициализирует объект базы данных и, следовательно, не исключение нулевого указателя.
Я должен что-то упустить - в каком состоянии было мое приложение для восстановления памяти (ссылка на объект базы данных), нодля отображения последней видимой активности при повторном запуске.
Кстати, теперь ошибка исправлена.VehicleDataProvider и другой подобный класс больше не расширяют поставщика данных суперкласса (UKMPGDataProvider), который теперь содержит частную ссылку на ukMpgData.Все методы, которые касаются базы данных, теперь проходят через UKMPGDataProvider, который проверит на ноль и при необходимости повторно инициализирует.
Заранее спасибо, Барри