Класс приложения с проблемой базы данных в Android

У меня проблемы с доступом к базе данных SQLite в моем приложении для Android. Я создал класс приложения, который содержит экземпляр SQLiteOpenHelper, однако всякий раз, когда я пытаюсь открыть БД в другом действии, происходит сбой.

Вот мой класс приложения:

public class GlobalVariables extends Application {

    private LocationsData locations;

    public void onCreate(Context context) {
            locations = new LocationsData(context);
    }

    public LocationsData getLocations() {
           return locations;
    }
}

Вот мой класс SQLiteOpenHelper:

public class LocationsData extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "locations.db";
private static final int DATABASE_VERSION = 1;

public static final String TABLE_LOCATIONS = "locations";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NICKNAME = "nickname";

private static final String DATABASE_CREATE = "create table "
        + TABLE_LOCATIONS + "( " + COLUMN_ID
        + " integer primary key autoincrement, " + COLUMN_NICKNAME
        + " text not null);";

public LocationsData(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DATABASE_CREATE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOCATIONS);
    onCreate(db);

}

}

И когда я пытаюсь получить доступ к БД в другом действии, подобном этому, я получаю сообщение об ошибке:

    @Override
    public void onResume()
    {
         locationsData=((GlobalVariables)getApplication()).getLocations();
         SQLiteDatabase db = locationsData.getReadableDatabase();
         super.onResume();
    }

Любая помощь? Спасибо!

Log Cat:
05-10 02:00:50.146: D/AndroidRuntime(532): Shutting down VM
05-10 02:00:50.146: W/dalvikvm(532): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-10 02:00:50.179: E/AndroidRuntime(532): FATAL EXCEPTION: main
05-10 02:00:50.179: E/AndroidRuntime(532): java.lang.RuntimeException: Unable to resume activity {com.John.seniorDesign/com.John.seniorDesign.LocationsTabActivity}: java.lang.NullPointerException
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:138)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.widget.TabHost.setCurrentTab(TabHost.java:326)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.view.View.performClick(View.java:2485)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.view.View$PerformClick.run(View.java:9080)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.os.Handler.handleCallback(Handler.java:587)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.os.Looper.loop(Looper.java:130)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-10 02:00:50.179: E/AndroidRuntime(532):  at java.lang.reflect.Method.invokeNative(Native Method)
05-10 02:00:50.179: E/AndroidRuntime(532):  at java.lang.reflect.Method.invoke(Method.java:507)
05-10 02:00:50.179: E/AndroidRuntime(532):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-10 02:00:50.179: E/AndroidRuntime(532):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-10 02:00:50.179: E/AndroidRuntime(532):  at dalvik.system.NativeStart.main(Native Method)
05-10 02:00:50.179: E/AndroidRuntime(532): Caused by: java.lang.NullPointerException
05-10 02:00:50.179: E/AndroidRuntime(532):  at com.John.seniorDesign.LocationsTabActivity.onResume(LocationsTabActivity.java:75)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.Activity.performResume(Activity.java:3832)
05-10 02:00:50.179: E/AndroidRuntime(532):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
05-10 02:00:50.179: E/AndroidRuntime(532):  ... 17 more

person Seuby    schedule 10.05.2012    source источник
comment
опубликуйте трассировку стека ошибки из logcat.   -  person superfell    schedule 10.05.2012
comment
Я думаю, что это может быть как-то связано с неправильным контекстом в вызове onCreate() в классе GlobalVariables. Но я не уверен...   -  person Seuby    schedule 10.05.2012
comment
опубликуйте код для LocationsTabActivity.onResume   -  person superfell    schedule 10.05.2012
comment
Это то, что я написал в последней части, но я ее отредактирую, чтобы было понятнее.   -  person Seuby    schedule 10.05.2012
comment
Что-то пустое в строке 75: Причина: java.lang.NullPointerException 05-10 02:00:50.179: E/AndroidRuntime(532): at com.John.seniorDesign.LocationsTabActivity.onResume(LocationsTabActivity.java:75)   -  person theelfismike    schedule 10.05.2012


Ответы (3)


В GlobalVariables измените контекст на getApplicationContext() в новых LocationsData и удалите контекст из onCreate — этой подписи не существует.

ИЗМЕНИТЬ:

public class GlobalVariables extends Application {

    private LocationsData locations;

    @Override
    public void onCreate() {
            locations = new LocationsData(getApplicationContext());
    }

    public LocationsData getLocations() {
           return locations;
    }
}
person Harald Wilhelm    schedule 10.05.2012
comment
@Override поймал бы это. - person superfell; 11.05.2012
comment
Конечно, добавил это к моему ответу. Спасибо. - person Harald Wilhelm; 11.05.2012

Не уверен, в чем причина, но вот как я обычно реализую свои функции открытия/закрытия БД:

В моем классе БД:

public GroceryDB(Context ctx) {
    this.mCtx = ctx;
}

public GroceryDB open() throws SQLException {
    mDBHelper = new DBHelper(mCtx);
    mDb = mDBHelper.getWritableDatabase();
    return this;
}

public void close() {
    mDBHelper.close();
}

Затем я вызываю его в любом другом классе так:

    mDbHelper = new GroceryDB(getActivity());
    mDbHelper.open();

Надеюсь это поможет!

person Barak    schedule 10.05.2012

В течение жизненного цикла вашего приложения вы всегда должны быть уверены, что имеете дело с одним экземпляром базы данных. Ознакомьтесь с этим ответом на аналогичный вопрос. Он дает несколько примеров того, как правильно открывать/закрывать базу данных в приложении.

person Alex Lockwood    schedule 11.05.2012