getWritableDatabase()出现空指针错误

hhn 2013-04-12 11:34:28
package irdc.sqlite.dao;

import irdc.sqlite.model.Register;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class RegisterDAO
{
private DBOpenHelper helper;
private SQLiteDatabase db;
private Context context;

public RegisterDAO(Context context)
{
helper = new DBOpenHelper(context);
}

/*添加注册信息*/
public void add(Register register)
{
DBOpenHelper helper = new DBOpenHelper(context);
db = helper.getWritableDatabase();
db.execSQL("insert into register (name,code) values (?,?)",new Object[]
{ register.getName(), register.getCode() });
}

/**
* 更新注册信息
*
*/
public void update(Register register)
{
db = helper.getWritableDatabase();
db.execSQL("update register set code = ? where name = ?", new Object[]
{ register.getName(), register.getCode()});
}

/*查找注册信息,验证密码是否正确*/
public Register find(String name)
{
db = helper.getWritableDatabase();
Cursor cursor = db.rawQuery("select name,code from register where name = ? ", new String[]
{String.valueOf(name)});
if (cursor.moveToNext())
{
return new Register(cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("code")));
}
return null;
}
}
...全文
1433 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
贫僧法号花尚 2015-05-13
  • 打赏
  • 举报
回复
这个问题 困扰了我好一段时间 不过 最后解决了,问题在于context 为空 你其他的写的都对 关键就是这个 context 如果是在Fragment中 你要去获取父级的activity 作为context 对象 传入你在fragment 里面new 出的 dao 废话不多说 上代码 FeedBackHomeActivity activity = getParentActivity(); if (activity == null) { return; } else { MessageDao dao = new MessageDao(activity); dao.add(infos, number); } /** * 获取父级Activity * * @return */ private FeedBackHomeActivity getParentActivity() { if (getActivity() == null) { return null; } return (FeedBackHomeActivity) getActivity(); }
kim_小金 2014-07-16
  • 打赏
  • 举报
回复
我遇到这样的问题了,你是怎么解决的呀。。
csdn_2013 2013-04-12
  • 打赏
  • 举报
回复
引用 楼主 huhuin123 的回复:
package irdc.sqlite.dao; import irdc.sqlite.model.Register; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class Regis……
LZ说的getWritableDatabase()出错,没有找到根本啊 具体的应该是你helper = new DBOpenHelper(context);时,context对象为null 导致你的helper为null 继而 helper.getWritableDatabase()有问题 RegisterDAO类中没有Context 对象 你无故的声明一个 是没用的 可以接受开启广播来启动一个服务,用该服务的实例来做context对象
hhn 2013-04-12
  • 打赏
  • 举报
回复
RegisterDAO
package irdc.sqlite.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import irdc.sqlite.model.Register;

/**
 * @author coolszy
 * @blog http://blog.csdn.net/coolszy
 */
public class RegisterDAO
{
  private DBOpenHelper helper1 = null;
  private SQLiteDatabase db;
  
  public RegisterDAO(Context context)
  {
   helper1 = new DBOpenHelper(context);
   //db = helper.getWritableDatabase();
  }
  
  /*添加注册信息*/
  public void add(Register register)
  {
    db = helper1.getWritableDatabase();
    db.execSQL("insert into register (name,code) values (?,?)",new Object[]
        { register.getName(), register.getCode() });
  }
  
  /**
   * 更新注册信息
   * 
   */
  public void update(Register register)
  {
    db = helper1.getWritableDatabase();
    db.execSQL("update register set code = ? where name = ?", new Object[]
    { register.getName(), register.getCode()});
  }
  
  /*查找注册信息,验证密码是否正确*/
  public Register find(String name)
  {
    db = helper1.getWritableDatabase();
    Cursor cursor = db.rawQuery("select name,code from register where name = ? ", new String[]
        {String.valueOf(name)});
    if (cursor.moveToNext())
    {
      return new Register(cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("code")));
    }
    return null;
  }
}
DBOpenHelper
package irdc.sqlite.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBOpenHelper extends SQLiteOpenHelper
{
  private static final int VERSION = 1;
  private static final String DBNAME = "data.db";
  private static final String REGISTER = "register";
  
  public DBOpenHelper(Context context)
  {
    super(context, DBNAME, null, VERSION);
  }
  
  @Override
  public void onCreate(SQLiteDatabase db)
  {
    db.execSQL("create table "+REGISTER+" (name varchar(20) primary key,code integer)");
  }
  
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVerison)
  {
    Log.i("StudentDAOTest", "UpGrade!");
  }
}
EX07_151
package irdc.ex07_15;
/* import相关class */
import irdc.sqlite.dao.RegisterDAO;
import irdc.sqlite.model.Register;
import android.R.integer;
import android.app.Activity;
import android.os.Bundle; 
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class EX07_151 extends Activity
{
  private Button button01,button02;
  private EditText editName,editCode;
  private Context context;
  /** Called when the activity is first created. */ 
  @Override 
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    /* 加载main.xml Layout */ 
    setContentView(R.layout.mylayout);
    /* 以findViewById()取得Button对象,并加入onClickListener */
    editName = (EditText) findViewById(R.id.name);
    editCode = (EditText) findViewById(R.id.code);
    button01 = (Button) findViewById(R.id.button01);
    button02 = (Button) findViewById(R.id.button02);
    button01.setOnClickListener(new Button.OnClickListener()
    {
      public void onClick (View v)
      {
        /* new一个Intent对象,并指定要启动的class */ 
        Intent intent = new Intent(); 
        intent.setClass(EX07_151.this, EX07_15.class);
        /* 调用一个新的Activity */ startActivity(intent);
        /* 关闭原本的Activity */EX07_151.this.finish();     
      }
    });
    button02.setOnClickListener(new Button.OnClickListener()
    {
      public void onClick(View v)
      {
        RegisterDAO registerDAO = new RegisterDAO(context);
        String name = editName.getText().toString();
        Integer code = Integer.parseInt(editCode.getText().toString());
        Register register = new Register(name,code);
        registerDAO.add(register);
        Toast.makeText(EX07_151.this, "保存成功", Toast.LENGTH_LONG).show();
        // TODO Auto-generated method stub
        
      }  
    });
  }
}
hhn 2013-04-12
  • 打赏
  • 举报
回复
package com.szy.sqlite.dao; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.szy.sqlite.model.Student; /** * @author coolszy * @blog http://blog.csdn.net/coolszy */ public class StudentDAO { private DBOpenHelper helper; private SQLiteDatabase db; public StudentDAO(Context context) { helper = new DBOpenHelper(context); } /** * 添加新的学生信息 * * @param student */ public void add(Student student) { db = helper.getWritableDatabase(); db.execSQL("insert into t_student (sid,name,age) values (?,?,?)", new Object[] { student.getSid(), student.getName(), student.getAge() }); } 还是报错为空指针,这是为什么??
hhn 2013-04-12
  • 打赏
  • 举报
回复
开启广播来启动一个服务,用该服务的实例来做context对象 具体应该怎么做,我是新手,请指导一下

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧