我使用dbhelper将数据插入sqlitedatabase时获得空指针异常

时间:2012-08-07 08:02:45

标签: android sqlite

当我插入记录时,我面临以下问题: java.lang.runtimeexception unable to start activity componentinfo java.lang.nullpointerexception。我在将值插入sqlite数据库时遇到空指针异常。当我尝试通过设置断点来检查其值时,DatabaseHelper dh = new DatabaseHelper(this)中的dh将显示为null。下面是我的DatabaseHelper类的代码以及我尝试插入值的类。

第一项活动:DbActivity.java

package com.example.dbhelpersimple;

import android.os.Bundle;
import android.provider.Contacts;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;

public class DbActivity extends SQLiteOpenHelper {

    public static final String COL_NAME = "name";
    public static final String COL_CNT = "contact";
    private static final String DATABASE_TABLE = "test";
    private static String DATABASE_NAME = "PERSONS.db";

    private static final String DATABASE_CREATE="CREATE TABLE test"+
            "(name VARCHAR(10), contact VARCHAR(10));";





    SQLiteDatabase db;





    public DbActivity(Context context) {
        super(context, DATABASE_NAME, null, 1);
        // TODO Auto-generated constructor stub
    }









    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

        db.execSQL(DATABASE_NAME);
        onCreate(db);
    }

    void addrecord(String name, String contact)
    {
        ContentValues cv=new ContentValues();
        cv.put(COL_NAME, name);
        cv.put(COL_CNT, contact);
        db.insert(DATABASE_TABLE, null, cv);
        db.close();
    }


    void getrecords()
    {
        int i;
        //String query="SELECT * FROM test";
        Cursor c=db.query(DATABASE_TABLE, null, null, null, null, null, null);
        c.moveToFirst();

        while(c.isAfterLast()==false)
        {
            Log.d("Name", c.getString(0));
            Log.d("Contact", c.getString(1));
        }



    }


}

第二个活动:manipulateActivity.java

package com.example.dbhelpersimple;

import android.app.Activity;

import android.os.Bundle;

import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import android.widget.SimpleAdapter;


public class manipulateActivity extends Activity{

    Button btn1,btn2,btn3;

      EditText edt1,edt2;


     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_db);

            edt1=(EditText)findViewById(R.id.edittextname);
            edt2=(EditText)findViewById(R.id.edittextcontact);

    DbActivity dbact= new DbActivity(this);

    dbact.addrecord("sagar", "111");




     }

}

4 个答案:

答案 0 :(得分:1)

第一项活动 DbActivity.java

private final Context context;

public DbActivity(Context context)
    {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;

    }
private static final String DATABASE_CREATE =
               "create table test (_id integer primary key autoincrement, "
               + "name text Not Null, contact text Not Null);";

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


}

第二项活动 ManipulateActivity.java

private DbActivity dbHelper;

private Context context;

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

 dbHelper = new DbActivity(context);

答案 1 :(得分:0)

如下所述,填写你的DbActivity类构造函数。

     public DbActivity(Context context) {
    super(context, DATABASE_NAME, null, 1);
    // TODO Auto-generated constructor stub
       this.myContext = context;   // myContext is your context in DbActivity class
  }

我认为你没有得到上下文,这就是为什么你得到空指针异常。希望这有助于:)

答案 2 :(得分:0)

尝试以下代码。我认为你在database_create语句中有问题。

private static final String DATABASE_CREATE =
                   "create table test (_id integer primary key autoincrement, "
                   + "name text Not Null, contact text Not Null);";

答案 3 :(得分:0)

代码中有太多无意义的东西。但是,一个接一个:

在SQLite中,没有VARCHAR。此类型会自动转换为TEXT类型,其概述为in the docs

  

请注意,VARCHAR类型包含字符串“CHAR”,因此   分配了TEXT亲和力。


在DatabaseHelper-class onUpgrade() - 方法中,您有以下代码:

db.execSQL(DATABASE_NAME);

由于DATABASE_NAME - 常量只是数据库文件的名称(因此不是有效的SQL查询),因此会失败。


在您的addrecord() - 方法中,您使用的是SQLiteDatabase - 对象,该对象从未初始化。这就是你获得NPE的原因。

要从SQLiteOpenHelper获取可读/可写数据库,请使用getReadableDatabase() - 和getWritableDatabase() - 方法。

启动Activity时出现此问题的原因是,您在活动onCreate() - 方法中使用此方法,该方法在创建活动时调用。


addrecord() - 方法的工作实现可能如下所示:

public void addrecord(String name, String contact){
    ContentValues cv=new ContentValues();
    cv.put(COL_NAME, name);
    cv.put(COL_CNT, contact);
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(DATABASE_TABLE, null, cv);
    db.close();
}