【问题标题】:Android - Why am I getting NullPointerException in SQLiteOpenHelper onCreate?Android - 为什么我在 SQLiteOpenHelper onCreate 中得到 NullPointerException?
【发布时间】:2012-12-06 20:28:33
【问题描述】:

我已经使用 LogCat 来确定问题所在。

我试图在 onCreate 中执行的 SQL 字符串是..

CREATE TABLE Routines(_id integer primary key autoincrement, json TEXT);

当它试图执行这个时,问题就出现了。

这很可能是导致NullPointerException 的原因。如果您看不出有什么问题,请继续阅读以了解更多背景信息。

此数据库尚未创建,我不断收到NullpointerException,我已将其与之前的 SQLite 代码进行了比较,问题证明是回避。

但是,我提到这一点,因为它仍然需要通过 onCreate 方法。我在我的主代码中创建了一个新的DatabaseOpenHelper(扩展 SQliteOpenHelper)并调用助手的 open() 方法,如下所示。

public void open() throws SQLException
{
    ssDatabase = databaseOpenHelper.getWritableDatabase();
}

如果我没记错的话,因为我的数据库还没有创建(我通过之前卸载它来确定)。调用 open() 方法时会调用 onCreate SQLiteHelper。

这是我调用 open 方法的代码。

    try
    {                   
        dbConnector = new DatabaseConnector (this);
        debug = "2 ";

        // This on first start will invoke the database onCreate method - throws SQLException
        dbConnector.open();  /* PROBLEM LINE */
        debug = "3 ";
    }
    catch (Exception e)
    {
        textView1.setText(debug + e.toString());
    }

这是包含我的 DatabaseOpenHelper 和 onCreate 方法的代码

private class DatabaseOpenHelper extends SQLiteOpenHelper
{
    public DatabaseOpenHelper(Context context, String name, CursorFactory factory, int version)
    {
        super(context, name, factory, version); 

        Log.i(TAG, "Constructor");
    }

    // On initial creation of database
    @Override
    public void onCreate(SQLiteDatabase db)
    {
        Log.i(TAG, "Before SQL command");

        String sqlCreateCommand = "CREATE TABLE Routines"
                + "(_id integer primary key autoincrement, "
                + "json TEXT);";

        Log.i(TAG, sqlCreateCommand); 

        // I believe this to be the PROBLEM LINE
        ssDatabase.execSQL(sqlCreateCommand); 

        Log.i(TAG, "Jab done");
    }

    // On upgrade - currently do nothing
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {}      
}   

感谢您的帮助!

【问题讨论】:

  • 完整的堆栈跟踪也会很有用:)
  • 您是否尝试调试您的代码以找到它?
  • 嗯,如果你的意思是“问题”选项卡中的错误,那么这条路径根本没有。我所指的唯一例外是我在 TextView 上显示的.. 可能有点菜鸟的事情要做:P 在我的 LogCat 上,除了我自己的标签之外,这个例外被捕获。
  • 是的,我已经尝试了一段时间 LogCatting 并使用 Eclipse 调试器。但是使用 Eclipse 调试器,当我来到 execSQL 行时,它会给出这个 Class File Editor - Source not found 消息,我不太了解它或如何解释它

标签: java android sql sqlite sqliteopenhelper


【解决方案1】:

似乎我没有权限发表评论。一个问题:ssDatabase.execSQL(sqlCreateCommand); --> 这不应该是db.execSQL(sqlCreateCommand); 因为参数是 SQLiteDatabase db。其次,您使用_id。这个索引不是默认创建的吗?没关系,如果这与它无关。这只是我的想法。 :)

【讨论】:

  • 啊,我真是个傻瓜!哈哈,我想这就是数小时的编码对你的影响,对我来说很好!谢谢!据我所知,它不是默认值,建议使用“_id”,它允许 ContentProviders 具有特殊功能,但仍然必须设置。到目前为止,这是我从一堆教程中收集到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多