2011-10-31 65 views
2

我有以下DBAdapter(这不是全部,但它是相关的代码)。Android SQLite - openOrCreateDatabase()nullPointerException

private final String DATABASE_NAME = "seller"; 
private final String DATABASE_MY_TABLE = "sellertable"; 
private final Integer DATABASE_VERSION = 1 
private final String CREATE_TABLE = "CREATE TABLE seller ........"; 

public DBAdapter(Context c) 
{ 
    this.context = c; 
    DBHelper = new DatabaseHelper(context); 
} 

private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    public DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     MyLog.d("Creating Tables"); 
     try 
     { 
      db.execSQL(CREATE_TABLE); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     MyLog.w("Upgrading database from version " + oldVersion + " to " + newVersion + ". Destroying old data."); 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_MY_TABLE); 
     onCreate(db); 
    } 
} 

// Opens the database 
public DBAdapter open() throws SQLException 
{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

当我尝试db.open()我得到如下:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate application com.company.app.MyApp: java.lang.NullPointerException 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:466) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3260) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:969) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
    at com.company.app.DBAdapter.open(DBAdapter.java:74) 
    at com.company.app.MyApp.<init>(MyApp.java:106) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1409) 
    at android.app.Instrumentation.newApplication(Instrumentation.java:957) 
    at android.app.Instrumentation.newApplication(Instrumentation.java:942) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:461) 

看起来它越来越某种异常的,有关当帮手是决定是否要创建或更新数据库。 ..

+0

DATABASE_NAME是什么值? – James

+0

这只是“卖家”的常数。对不起,我没有抛出所有常量,我会添加我需要的上述代码。 –

+0

这几乎肯定是由'Context'传入'null'引起的 - [''ContextWrapper.java:203'](http://grepcode.com/file/repository.grepcode.com/java' /ext/com.google.android/android/2.3.5_r1/android/content/ContextWrapper.java#ContextWrapper.openOrCreateDatabase%28java.lang.String%2Cint%2Candroid.database.sqlite.SQLiteDatabase.CursorFactory%29)可能会导致一个NPE。 –

回答

3

尝试在数据库名称末尾添加一个类似“.db”的扩展名。

+0

好吧,我以其他方式修复了它..我不确定我做了什么。我认为这是一个背景问题。我猜应用程序上下文从来没有传递给DBAdapter或什么......与.db添加到名称末尾的处理是什么?这是一个已知的修补程序还是推荐的方法来命名它们? –

+0

这只是我一直教的方式。如果文件系统不关心没有扩展名,我不知道它有意义。数据库名称之后是一个文件名。 – James

+0

如上建议,最好放在.db – hovanessyan

5

我刚碰到这个,可能是出于不同的原因。我尝试了一些涉及onCreate()被调用之前的上下文的db相关的东西。希望这可以帮助那里的人

+3

这就是原因。接受的答案是混乱的。从问题的堆栈跟踪中可以明显地看出问题:在MyApp中打开数据库。 '即成员变量初始化,远在'onCreate()'之前。 – laalto

0

如果确切的问题是上下文然后,我可以建议,因为我昨天面临同样的问题。

假设我打电话给DatabaseHelper从其他类然后我不得不提供上下文。我很困惑哪些上下文: 1. getApplicationContext() 2. getBaseContext() 3.在调用DatabaseHelper对象的类的构造函数中初始化的Context的实例,即_context。

但是我得到了实际解决方案是使用本

例如: -

DatabaseHelper dbHelper =新DatabaseHelper();