SQLite getReadableDatabase()返回NULL

时间:2012-02-04 14:52:41

标签: android database sqlite nullpointerexception

我正在使用Android的SQLite来创建基于某些文件的关卡数据库。我首先创建一个SQLiteOpenHelper,然后在其上调用getReadableDatabase()或getWritableDatabase(),以便调用onCreate()方法并创建我的数据库:

@Override //Main Activity
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dbHelper = new DbOpenHelper(this);
    database = dbHelper.getWritableDatabase();  //is a field

-

public DbOpenHelper(Context context) {
    super(context, DB_NAME, null, DATABASE_VERSION);
    Log.d("CREATING CLASSS", "OSDIFJE*(#");
}

 @Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DB_TABLE_CREATE);
    loadLevelData();
}

// Load data into the database on creation
private void loadLevelData() {
    Log.d("DbOpenHelper", "Loading Level Data");
    AssetManager mgr = MenuActi ~~snip~~                                                     
    Log.d("dataaosdifj",MenuActivity.database.toString()); //NullPointerException!
    MenuActivity.database.insert(DB_TABLE_NAME, null, info);
        }  

我还尝试在loadLevelData()方法中调用getWritableDatabase(),结果相同 我看到这是一个非常普遍的问题,但是大多数关于它的线程都没有任何解决方案!

请:'(

1 个答案:

答案 0 :(得分:3)

为什么要从open helper中的活动访问实例变量?如果我正确理解您的代码,那么您的loadLevelData()方法就是您的开放帮助方法。而不是你有什么,为什么不这样做:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DB_TABLE_CREATE);
    loadLevelData(db);
}

// Load data into the database on creation
private void loadLevelData(SQLiteDatabase db) {
    ...
    db.insert(DB_TABLE_NAME, null, info);
} 

问题的根源在于,当您在DbOpenHelper中访问活动时,您的活动中的database实例变量尚未分配...您仍然在通话中的&{ #39;创建数据库 - 恰好是dbHelper.getWritableDatabase() - 并且结果没有返回给作业。