0

当我插入记录时,我面临以下问题: java.lang.runtimeexception unable to start activity componentinfo java.lang.nullpointerexception.我在将值插入 sqlite 数据库时遇到空指针异常。当我尝试通过放置断点检查其值时,dh inDatabaseHelper dh = new DatabaseHelper(this)为空。下面是我的 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));
        }



    }


}

第二个活动:operatedActivity.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

4 回答 4

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);
于 2012-08-07T08:22:02.250 回答
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
  }

我认为你没有得到上下文,这就是你得到空指针异常的原因。希望这会有所帮助:)

于 2012-08-07T08:10:04.970 回答
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);";
于 2012-08-07T08:11:59.947 回答
0

该代码中有很多废话。但是,一个接一个:

在 SQLite 中,没有VARCHAR. 此类型会自动转换为文档TEXT中概述的类型:

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


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

db.execSQL(DATABASE_NAME);

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


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

要从您的 中选择读/写数据库SQLiteOpenHelper,请使用getReadableDatabase()- 和 -getWritableDatabase()方法。

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


您的 -method 的工作实现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();
}
于 2012-08-07T08:20:10.337 回答