2 i405817461 i405817461 于 2013.06.07 10:33 提问

在更新和删除SQLite数据库时报错NullPointerException

我的Activity首先打开了数据库。

private DBAdapter dbAdepter;

dbAdepter = new DBAdapter(this);
    dbAdepter.open();

然后更新操作如下:

public class Heimingdan_Alter extends Activity {

private DBAdapter dbAdepter;

private EditText editname;
private EditText edittelephone;
private Button update1;
private Button delete;

private String name,phone,id,name0,telephone0;
//public int id;
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
     //设置无标题
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.fix_blacklist);

    dbAdepter = new DBAdapter(this);
    dbAdepter.open();


    //MyApplication.getInstance().addActivity(this);
    editname=(EditText)findViewById(R.id.hmd_name);
    edittelephone=(EditText)findViewById(R.id.hmd_num);
    update1=(Button)findViewById(R.id.ensure);
    delete=(Button)findViewById(R.id.delete);

    Intent i = getIntent();
    telephone0=i.getStringExtra("telephone");
    name0=i.getStringExtra("name");
    id=i.getStringExtra("id");

    editname.setText(i.getStringExtra("name"));
    edittelephone.setText(i.getStringExtra("telephone"));

    //更新事件
    update1.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
            name=editname.getText().toString();
            phone=edittelephone.getText().toString();
            if(name.equals("")||phone.equals("")){
                Toast.makeText(Heimingdan_Alter.this, "您输入的信息不完整哦~",Toast.LENGTH_LONG).show();
            }
            else {


                BlackNumber blacknumber = new BlackNumber();
                BlackNumber blacknumber2 = new BlackNumber();
                blacknumber.telephone = phone;
                blacknumber.name = name;
                Log.v("更新的黑名单值", blacknumber.telephone+blacknumber.name);

                blacknumber2.telephone = telephone0;
                blacknumber2.name = name0;
                Log.v("以前的黑名单值", blacknumber2.telephone+blacknumber2.name);


                    dbAdepter.updateblack(id,blacknumber,blacknumber2);




                onBackPressed();
                Toast.makeText(Heimingdan_Alter.this, "修改成功!", Toast.LENGTH_LONG).show();


            }
        }
    });
}

然后在DBAdapter.java中如下

public void open() throws SQLiteException {

    try {
        db = dbOpenHelper.getWritableDatabase();
        Log.v("DBAdapter_Open_getWritableDatabase",
                "DBAdapter_Open_getWritableDatabase");
    } catch (SQLiteException ex) {
        db = dbOpenHelper.getReadableDatabase();
        Log.v("DBAdapter_Open_getReadableDatabase",
                "DBAdapter_Open_getReadableDatabase");
    }
}
public int updateblack(String id,BlackNumber blacknumber, BlackNumber blacknumber2) {
    ContentValues newValues = new ContentValues();
    Log.e("updateblack",blacknumber.name + blacknumber.telephone+ "from"  + blacknumber2.telephone);
    newValues.put("name", blacknumber.name);
    newValues.put("telephone", blacknumber.telephone);

    int _id=Integer.parseInt(id);

    int colunm = db.update("blacklist", newValues, "_id" + "=" + _id , null);




    Log.e("updateblacksuccess", blacknumber.name + ":" + blacknumber.telephone
            + "from"  + blacknumber2.name);
    return colunm;

}

其中BlackNumber是一个含有两个String(name,telephone)和一个int(id)的类。

每次调试都说是
int colunm = db.update("blacklist", newValues, "_id" + "=" + _id , null);
这一行出错。
但是调试log信息表示id得到了也是对的。blacklist名字也没错。这一行我加到插入的方法里就好使,但是到这里就报错。是个什么问题?
求大神

1个回答

shaojie519
shaojie519   2013.06.07 14:19

输出下你的 db, blacknumber, blacknumber2 三个对象,检查下是否为空

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
建立外键关系,实现级联更新和删除
----------建立外键关系,实现级联更新和删除------------创建表CREATE TABLE TNAME(TNAME VARCHAR(20) PRIMARY KEY NOT NULL,CNAME VARCHAR(20))CREATE TABLE FNAME([ID] INT PRIMARY KEY NOT NULL,TNAME VARC
update的时候数据库的处理情况
  有人问到:     今天听一个IBM的人说数据库在update时是先删除原记录,然后在插入,对此我有些疑问,oracle好像不是这样的,请大家能否阐述一下update的过程,更新主键和不更新主键的处理是否一样?不胜感激。另外,那个IBM的人还说update和insert不是一个数量级的动作,我认为要具体分析,对同数据量的操作,update需要定位,但是慢多少呢?   答: 其他数据库跟orac
数据库主键,外键,关系,级联保存、更新、删除
--建立数据库create database test;go--建立表customerscreate table customers(id int identity(1,1) not null,name varchar(15),age int,primary key(id));go--建立表orderscreate table orders(id int identity(1,1) not nul
外键约束失效--级联更新删除
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String classesSQL = "CREATE TABLE classes(class_id varchar(10) primary key , " + "class_name varchar(20))";
App版本更新时对SQLite数据库表的修改问题
在数据库版本升级时, 我们可能会遇到这样一些情况: 需要扩展一个表的字段 删除掉原来表上某个冗余的字段 新建一个表 而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。首先,我们都知道,当我们的数据库版本号从低版本到高版本的升级之后,会调用SQLiteOpenHelper中的 onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion,
数据库表的级联删除与更新
网上查到实现级联删除与更新,有三种方法:1、设置外键 ;2、设置触发器;3、通过程序控制。
SQL_数据库基础之级联删除和级联更新
原文: 级联删除 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。 语法: FOREIGN KEY(COLUMN[,...n]) REFERENCES referenced_table_name[(ref_column[,...n])] [ON DELETE cascade] [ON UPDATE cascad
级联删除和更新
首先,目前在产品环境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。  下面,我们先创建以下测试用数据库表:  CREATE TABLE `roottb` (   `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,   `data` VARCHAR(100) N
django sqlite3 后台数据库的增删改查
配置:django2.0, sqlite3, pycharm专业版 在入门的文章里已经写了怎么新建数据库和数据表,那么后台怎么操作数据库呢。 这篇文章梳理了以下后台开发人员操作数据库的基本操作。 首先,我花了一点时间才明白,按入门操作来,默认生成的数据库名字就叫db.sqlite3。 有三种办法可以对数据库进行操作。 1、网上查到的大部分sql语句要这么写: 点击右边的data
·HQL语句的更新和删除_Hibernate
·HQL语句的更新和删除_Hibernate   2009-12-10 09:28:14|  分类: Hibernate|字号 订阅   1.实体的更新和删除:   在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。这项技术功能是Hibernate3的新加入的功能,在Hibernate2中是不具备的。