2013-09-22 6 views
1

У меня есть Android.App.Application, который пытается создать БД. Я использую код примера SQLite db. Он отлично работает, если я использую его внутри Activity. Когда я пытаюсь создать то же самое в моем Android.App.Application, он сработает. Я не знаю, почему.Создать Sqlitedb из Android.App.Application

Когда я звоню это из деятельности:

public class Manager extends Activity{ 
@Override 
protected void onCreate(Bundle savedInstanceState) {   
    fbdbhelper = new FishingBuddyOpenHelper(getApplicationContext()); 
    db = fbdbhelper.getTbfw().getReadableDatabase(); 
    } 

БД SQLite создается (/data/data/com.fishingbuddy/databases/)

Когда это сделано из Android.App .Application он терпит неудачу:

public class FishingManager extends Application{  
public FishingManager() {  
    fbdbhelper = new FishingBuddyOpenHelper(getApplicationContext()); 
    db = fbdbhelper.getTbfw().getReadableDatabase(); 
    } 

09-22 21: 19: 18.386: E/AndroidRuntime (21881): неустранимым: главный 09-22 21: 19: 1 8.386: E/AndroidRuntime (21881): java.lang.RuntimeException: Не удалось> создать экземпляр приложения com.fishingbuddy.logic.FishingManager: java.lang.NullPointerException 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.LoadedApk.makeApplication (LoadedApk.java:504) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.ActivityThread.handleBindApplication (ActivityThread.java:4550) 09- 22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.ActivityThread.access $ 1300 (ActivityThread.java:153) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): у android. app.ActivityThread $ H.handleMessage (ActivityThread.java:1307) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.os.Handler.dispatchMessage (Handler.java:99) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.os.Looper.loop (Looper.java:13 7) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.ActivityThread.main (ActivityThread.java:5227) 09-22 21: 19: 18.386: E/AndroidRuntime (21881) : at java.lang.reflect.Method.invokeNative (собственный метод) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at java.lang.reflect.Method.invoke (Method.java:511) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:795) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:562) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at dalvik.system.NativeStart.main (родной Метод) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): вызвано: java.lang.NullPointerException 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.content.ContextWrapper.getApplicationContext (ContextWrapper.java:109) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at com.fishingbuddy.logic.FishingManager. (FishingManager .java: 26) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at java.lang.Class.newInstanceImpl (собственный метод) 09-22 21: 19: 18.386: E/AndroidRuntime (21881) : at java.lang.Class.newInstance (Class.java:1319) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.Instrumentation.newApplication (Instrumentation.java:983) 09 -22 21: 19: 18.386: E/AndroidRuntime (21881): at android.app.Instrumentation.newApplication (Instrumentation.java:968) 09-22 21: 19: 18.386: E/AndroidRuntime (21881): на android. app.LoadedApk.makeApplication (LoadedApk.java:499) 09-22 21: 19: 18.386: E/AndroidR unime (21881): ... 11

Я использую приложение, потому что я использую шаблон singleton для своего рыболовного менеджера. Все отлично работало, пока я не запустил финальную часть, сохранив все свои данные в SQLite db.

Заранее спасибо

+0

Что 'fbdbhelper.getTbfw()' делает? – gunar

+0

Получает объект db, который включает определение для таблицы – flitjes

ответ

1

Когда я звоню это из деятельности:

Это будет врезаться с SuperNotCalledException.

Когда это сделано из Android.App.Application он не

Даже если вы удалили две строки кода здесь, это приведет к краху, с SuperNotCalledException.

Пожалуйста, позвоните super.onCreate() в onCreate() из Activity (или Application), прежде чем делать что-нибудь еще.

Я использую приложение, потому что я использую шаблон singleton для своего рыболовного менеджера.

Подкласс Application не нужен, чтобы иметь однотонный SQLiteOpenHelper. Вам просто нужен синглтон SQLiteOpenHelper, который вы lazy-initialize при первом использовании.

+0

Шаблон Singleton применяется к менеджеру, который включает в себя db. Таким образом, не используется db Singleton. – flitjes

+0

@flitjes: Это хорошо, но вам по-прежнему не нужен подкласс «Application», чтобы иметь singleton 'SQLiteOpenHelper',« manager »или что-то еще. – CommonsWare

+0

Хорошо, что все еще не отвечает на вопрос. Я забыл добавить супервызывные действия. Но почему это не будет работать в приложении. Я не хочу, чтобы SQLiteOpenHelper Singleton явно, он просто собрался, решив добавить sqlite db. – flitjes

0

Вы, вероятно, нужно объявить поставщика контента в файле манифеста, как дано в этом example

Смежные вопросы