마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

db에서 수정 삭제 메소드 불러 오는게 nullpointerexception납니다

0 추천
이건 helper쪽 입니다

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

import com.example.em_test.CustomAdapter;
import com.example.em_test.DLog;

public class DbOpenHelper {

 private static final String DATABASE_NAME = "addressbook.db";
 private static final int DATABASE_VERSION = 1;
 public static SQLiteDatabase mDB;
 private DatabaseHelper mDBHelper;
 private Context mCtx;
 CustomAdapter CustomAdapter; 
 private class DatabaseHelper extends SQLiteOpenHelper{

  // 생성자
  public DatabaseHelper(Context context, String name,
    CursorFactory factory, int version) {
   super(context, name, factory, version);
  }

  // 최초 DB를 만들때 한번만 호출된다.
  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL(DataBases.CreateDB._CREATE);

  }

  // 버전이 업데이트 되었을 경우 DB를 다시 만들어 준다.
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   db.execSQL("DROP TABLE IF EXISTS "+DataBases.CreateDB._TABLENAME);
   onCreate(db);
  }
 }

 public DbOpenHelper(Context context){
  this.mCtx = context;
 }

 public DbOpenHelper open() throws SQLException{
  mDBHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
  mDB = mDBHelper.getWritableDatabase();
  return this;
 }

 public void close(){
  mDB.close();
 }

 // Insert DB
 public long insertColumn(String name, String phone){
  ContentValues values = new ContentValues();
  values.put(DataBases.CreateDB.NAME, name);
  values.put(DataBases.CreateDB.PHONE, phone);
  return mDB.insert(DataBases.CreateDB._TABLENAME, null, values);
 }

 // Update DB
 public boolean updateColumn(long id , String name, String phone){
  ContentValues values = new ContentValues();
  values.put(DataBases.CreateDB.NAME, name);
  values.put(DataBases.CreateDB.PHONE, phone);
  return mDB.update(DataBases.CreateDB._TABLENAME, values, "_id="+id, null) > 0;
 }

 // Delete ID
 public boolean deleteColumn(long id){
  return mDB.delete(DataBases.CreateDB._TABLENAME, "_id="+id, null) > 0;
 
 }
 public void deleteAll() {
    mDB.delete(DataBases.CreateDB._TABLENAME, null, null);
   }
 // Delete Contact
 public boolean deleteColumn(String number){
  return mDB.delete(DataBases.CreateDB._TABLENAME, "contact="+number, null) > 0;
 }
 // Select All
 public Cursor getAllColumns(){
  return mDB.query(DataBases.CreateDB._TABLENAME, null, null, null, null, null, null);
 }

 // ID 컬럼 얻어 오기
 public Cursor getColumn(long id){
  Cursor c = mDB.query(DataBases.CreateDB._TABLENAME, null, 
    "_id="+id, null, null, null, null);
  if(c != null && c.getCount() != 0)
   c.moveToFirst();
  return c;
 }

 // 이름 검색 하기 (rawQuery)
 public Cursor getMatchName(String name){
  Cursor c = mDB.rawQuery( "select * from address where name=" + "'" + name + "'" , null);
  return c;
 }
}

소스쪽 -------
import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import arabiannight.tistory.com.database.DbOpenHelper;

public class CustomAdapter extends ArrayAdapter<InfoClass> implements OnItemClickListener{
 
 private LayoutInflater inflater;
 private ArrayList<InfoClass> infoList;
 ViewHolder viewHolder;
 static int po=0;
 
 int a = 0;
 Number Number;
 Add_change Add_change;
 private Context con;
 DbOpenHelper mDbOpenHelper;
 private ArrayList<InfoClass> items;
 public CustomAdapter(Context context, ArrayList<InfoClass> items){
  super(context, po, items);
  this.items = items;
  inflater = LayoutInflater.from(context);
  infoList = items;
  con = context;
 }
 @Override
 public int getCount() {
  return infoList.size();
 }

 @Override
 public InfoClass getItem(int arg0) {
  return null;
 }

 @Override
 public long getItemId(int arg0) {
  return 0;
 }
 @Override
 public View getView(final int position, View convertview, ViewGroup parent) {
  
  View v = convertview;
  
  if(v == null){
   viewHolder = new ViewHolder();
   v = inflater.inflate(R.layout.item, null);
   viewHolder.name = (TextView)v.findViewById(R.id.mText);
   viewHolder.phone = (TextView)v.findViewById(R.id.mDate);
   viewHolder.mIcon = (ImageButton)v.findViewById(R.id.mImage);
   v.setTag(viewHolder);
   
  }else {
   viewHolder = (ViewHolder)v.getTag();
  }
  //현재의 position을 가지고 item을 가져온다.
  final InfoClass p = infoList.get(position);

  viewHolder.name.setText(p.name);
  viewHolder.phone.setText(p.phone);
  viewHolder.mIcon.setTag(position);
//  DLog.e(""+position,""+position);
//  viewHolder.name.setText(infoList.get(position).name);
//  viewHolder.phone.setText(infoList.get(position).phone);

//  po=position;
  viewHolder.name.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub

    DLog.e(""+position,""+position);
    a=1;
    InfoClass point = p;
    Intent intent = new Intent(con,Add_change.class);
    intent.putExtra("a", a);
    intent.putExtra("title",p.name);
    intent.putExtra("number",p.phone);
    intent.putExtra("p",""+ p);
    con.startActivity(intent);
   }
  });

 

프리머니 (270 포인트) 님이 2015년 6월 30일 질문
미쳐 다 못올렸습니다. 오류 난 부분은 밑에 부분에  mDbOpenHelper.deleteColumn(id); 이부분 입니다.

        viewHolder.phone.setOnLongClickListener(new OnLongClickListener() {
           
            @Override
            public boolean onLongClick(View v) {
                // TODO Auto-generated method stub
//                int point = Integer.parseInt(p);
                long id = getPosition(p);
               
                DLog.e(""+id,""+id);
                mDbOpenHelper.deleteColumn(id);
                notifyDataSetChanged();
                return false;
            }
        });       
        viewHolder.mIcon.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Intent intentcal = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
                        + viewHolder.phone));

                intentcal.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                con.startActivity(intentcal);
            }
        });
        return v;
    }
   
    public void setArrayList(ArrayList<InfoClass> arrays){
        this.infoList = arrays;
    }
   
    public ArrayList<InfoClass> getArrayList(){
        return infoList;
    }
   
   
    /*
     * ViewHolder
     */
    class ViewHolder{
        TextView name;
        TextView phone;
        ImageButton mIcon;

    }


    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub
        DLog.e("didididid","didididid");
       
    }
   

}

2개의 답변

0 추천

adapter 생성자에서 mDbOpenHelper 생성해주세요

지카 (540 포인트) 님이 2015년 6월 30일 답변
0 추천
long id = getPosition(p);
이부분 id를 제대로 가져왔는지...


mDbOpenHelper.deleteColumn(id);
메소드 보니까 id를 long 형태 그대로 넣어주는데

delete() 함수는 String 형 인자 3개를 입력받습니다..
이부분 확인해보시고요

이런경우엔 에러나는부분 주석처리 하고 돌려보고 에러가 안난다면
주석처리한 부분부터 메소드 따라가면서 분석해보세요

 

 

 

아시리 (8,400 포인트) 님이 2015년 6월 30일 답변
id값은 나옵니다 포지션값 나오는걸 로그로 확인했는데 이상하게 mDbOpenHelper.deleteColumn(id); 에서 계속 널 포인터 납니다...
...