【问题标题】:Create Sqlitedb from Android.App.Application从 Android.App.Application 创建 Sqlitedb
【发布时间】:2013-09-27 16:24:40
【问题描述】:

我有一个尝试创建数据库的 Android.App.Application。我正在使用 SQLite db 示例代码。如果我在 Activity 中使用它,效果会很好。当我尝试在我的 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:18.386: E/AndroidRuntime(21881): java.lang.RuntimeException: 无法>实例化应用程序 com.fishingbuddy.logic.FishingManager: java.lang.NullPointerException 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.app.LoadedApk.makeApplication(LoadedApk.java:504) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4550) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 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): 在 android.os.Handler.dispatchMessage(Handler.java:99) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.os.Looper.loop(Looper.java:137) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.app.ActivityThread.main(ActivityThread.java:5227) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 java.lang.reflect.Method.invokeNative(Native Method) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 java.lang.reflect.Method.invoke(Method.java:511) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 09-22 21:19:18.386: E/AndroidRuntime(21881): at dalvik.system.NativeStart.main(Native Method) 09-22 21:19:18.386:E/AndroidRuntime(21881):由:java.lang.NullPointerException 引起 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 com.fishingbuddy.logic.FishingManager.(FishingManager.java:26) 09-22 21:19:18.386:E/AndroidRuntime(21881):在 java.lang.Class.newInstanceImpl(本机方法) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 java.lang.Class.newInstance(Class.java:1319) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 android.app.Instrumentation.newApplication(Instrumentation.java:983) 09-22 21:19:18.386: E/AndroidRuntime(21881): 在 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/AndroidRuntime(21881): ... 11 更多

我正在使用应用程序,因为我正在为我的 FishingManager 使用单例模式。这一切都很好,直到我开始最后一部分,将我所有的数据保存到 SQLite db。

提前致谢

【问题讨论】:

  • fbdbhelper.getTbfw() 在做什么?
  • 获取包含表定义的数据库对象

标签: android sqlite


【解决方案1】:

当我从活动中调用它时:

它会因SuperNotCalledException 而崩溃。

从 Android.App.Application 完成时会失败

即使你删除了这里的两行代码,它也会崩溃,并带有SuperNotCalledException

在做任何其他事情之前,请在onCreate()Activity(或Application)中致电super.onCreate()

我正在使用应用程序,因为我正在为我的 FishingManager 使用单例模式。

你不需要Application 子类来拥有一个单例SQLiteOpenHelper。你只需要一个单例SQLiteOpenHelper,你在第一次使用时会延迟初始化。

【讨论】:

  • 单例模式应用于包含数据库的管理器。所以没有使用 db Singleton。
  • @flitjes:这很好,但你仍然不需要Application 的子类来拥有一个单例SQLiteOpenHelper、“经理”或其他任何东西。
  • 好吧,仍然没有回答这个问题。我忘了在活动中添加超级调用。但是为什么它不能在应用程序中工作。我不想要一个显式的 SQLiteOpenHelper Singleton,它只是在决定添加 sqlite db 之后才聚集在一起。
  • @flitjes:好吧,你在Application 子类中也错过了super.onCreate()。除此之外,不要调用getApplicationContext(),而是使用this,因为你 Application Context,而getApplicationContext() 是你崩溃的地方。
  • 啊,好吧,我去试试。
【解决方案2】:

您可能需要像 example 中给出的那样在清单文件中声明一个内容提供者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多