【问题标题】:SQLite getReadableDatabase() returns NULLSQLite getReadableDatabase() 返回 NULL
【发布时间】:2012-02-04 14:52:41
【问题描述】:

我正在使用 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(),结果相同。
我看到这是一个很常见的问题,但是关于它的大多数线程都没有任何解决方案!

请:'(

【问题讨论】:

  • 您的 DbOpenHelper 是否扩展了 SQLiteOpenHelper?数据库的类型是什么?
  • 是的,数据库是一个 SQLiteDatabase。

标签: android database sqlite nullpointerexception


【解决方案1】:

为什么要从您的开放助手内部的活动中访问实例变量?如果我正确理解您的代码,您的 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 实例变量并未分配...您仍在创建数据库的调用中——这恰好是 dbHelper.getWritableDatabase() -- 并且没有返回分配的结果。

【讨论】:

  • 课程!它基本上指的是它自己,在它的创造中。事实证明,我首先还必须解决一些其他问题,但这确实很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2019-02-28
相关资源
最近更新 更多