【问题标题】:NullPointerException while trying to create database using db.execSQL(DATABASE_CREATE)尝试使用 db.execSQL(DATABASE_CREATE) 创建数据库时出现 NullPointerException
【发布时间】:2012-07-27 18:20:45
【问题描述】:

我尝试了多次实验并意识到在尝试执行 SQL 查询时我得到了NullPointerException。我的完整查询是:

create table transactiontable(_id integer primary key autoincrement, name text not null, reason text not null, money text not null );

关于我哪里出错的建议?堆栈跟踪是:

Caused by: java.lang.NullPointerException
at com.example.startandroid.DBAdapter$DatabaseHelper.<init>(DBAdapter.java:110)
at com.example.startandroid.DBAdapter.open(DBAdapter.java:43)
at com.example.startandroid.MainActivity.onButtonClick(MainActivity.java:34)
Not sure what is the issue.

我的 SQL 适配器类是:

public class DBAdapter {

private static final String DATABASE_NAME = "transaction.db";
private static final String DATABASE_TABLE = "transactiontable";
private static final int    DATABASE_VERSION = 1;

public static final String KEY_ID   = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_REASON = "reason";
public static final String KEY_MONEY = "money";

private static final String DATABASE_CREATE = "create table " 
        + DATABASE_TABLE 
        + "("
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_NAME + " text not null,  " 
        + KEY_REASON + " text not null, "
        + KEY_MONEY + " text not null "
        + ");";

private final Context context;

private DatabaseHelper DBHelper;
private static SQLiteDatabase db;

public DBAdapter(Context context)
{
    this.context = context;
}

// Open the database
public DBAdapter open() throws SQLException
{
    DBHelper = new DatabaseHelper(context);
    if (DBHelper != null )
        db = DBHelper.getWritableDatabase();
    return this;
}

// Close the database
public void close()
{
    DBHelper.close();
}


private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) 
    {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
    }
}
}

我用代码调用这个类的函数:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    db = new DBAdapter(this);
    Log.e(TAG, "OnCreate is run");
    myIntent = new Intent(MainActivity.this, FrameActivity.class);
}

public void onButtonClick(View v)
{
    try
    {
        Log.e(TAG, "OnButtonClick starts");
        if (db != null)
        {
            db.open();
            db.close();
        }
    }
    catch(SQLException e)
    {
        e.printStackTrace();
    }
    MainActivity.this.startActivity(myIntent);
    finish();
}

【问题讨论】:

  • 您是否将有效的context 传递给 DBAdapter() 构造函数?

标签: android sqlite nullpointerexception


【解决方案1】:

dbDatabaseHelper 的构造函数中是null。移动线:

db.execSQL(DATABASE_CREATE);

DatabaseHelperonCreate方法中:

@Override
public void onCreate(SQLiteDatabase arg0) {
    arg0.execSQL(DATABASE_CREATE);
}

【讨论】:

  • 谢谢,这行得通。我想知道为什么在 db = new DBAdapter(this) 点之后 db 为空?
  • @miteshsharma 我的回答中的 db 不是指DBAdapter,而是指DBAdapter 中的SQLiteDatabase 字段(不幸的是,您也将其命名为, db)。当您调用 db.open() 时,db SQLiteDatabase 字段仍然是 null,因为它没有指向有效的数据库并且在其上调用 execSQL() 会引发异常。
猜你喜欢
  • 2020-01-02
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多