当我插入记录时,我面临以下问题:
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");
}
}
答案 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();
}