空指针创建SQLite数据库

时间:2011-08-23 10:40:05

标签: android sqlite nullpointerexception

为什么这两行代码会抛出一个NPE?

SQLiteDatabase db;
db = openOrCreateDatabase("TestingData.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);

堆栈跟踪:

08-23 10:33:14.285: ERROR/AndroidRuntime(1001): Caused by: java.lang.NullPointerException
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at org.*****.android.CopyOfSQLLite.data(CopyOfSQLLite.java:14)
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at org.******.android.*****.****(****.java:200)
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at org.********.android.****.onCreate(DashboardPage.java:25)
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-23 10:33:14.285: ERROR/AndroidRuntime(1001):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

2 个答案:

答案 0 :(得分:1)

您的ContextWrapper没有基本上下文。很可能你并没有在正确的地方调用这种方法,但如果没有更多的代码,我就不能说更多。

答案 1 :(得分:0)

Android的优点在于它是open source。所以我们可以看到openOrCreateDatabase()的实现方式如下:

public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
    return mBase.openOrCreateDatabase(name, mode, factory);
}

我可以看到此代码抛出NPE的唯一方法是mBase为空。从您的调用约定我假设您的类派生自android.content.ContextWrapper?如果是这样,您确实在实例化类时设置了基本上下文(mBase)吗?如果你不是,那就是造成这个问题的原因。