Java中的Java.lang.nullpointerexception在android中保存查询

时间:2017-07-26 09:43:36

标签: android nullpointerexception

我已经看了很多解决方案并应用了所有但仍然在我的代码中获得空指针异常。这是我的代码,请尽可能快地查看和回复。提前谢谢。

DBHandler.java类代码

public class DBHandler extends SQLiteOpenHelper {
//Database Version
private static final int DATABASE_VERSION=1;
// Database Name
private static final String DATABASE_NAME="Patient.db";
//Table Name
private static final String TABLE_NAME="patientDetail";

//Table Columns Names
private static final String ID="id";
private static final String NAME="name";
private static final String ADDRESS="address";
private static final String PHONE_NUMBER="phone_number";

//Constructor

public DBHandler(Context context)
{
    super(context,DATABASE_NAME,null,DATABASE_VERSION);
}

//Creating Tables

@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_PATIENT_DETAIL_TABLE="CREATE TABLE "+TABLE_NAME+"("
            + ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
            +NAME+" TEXT,"
            +ADDRESS  +" TEXT,"
            +PHONE_NUMBER + " TEXT )" ;

    db.execSQL(CREATE_PATIENT_DETAIL_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //Drop older tables if exist

    db.execSQL("DROP TABLE IF EXIST "+TABLE_NAME);

    /// Create Table again
    onCreate(db);
}
public boolean insertData(String name,String address, String ph_no)
{
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values= new ContentValues();
    values.put(NAME,name);
    values.put(ADDRESS,address);
    values.put(PHONE_NUMBER,ph_no);
    long result = db.insert(TABLE_NAME,null,values);
    if(result == -1)
        return  false;
    else
        return true;

}
}


//insertPatient.java Class Code

public class insertPatient extends Fragment {

DBHandler mydb=null;

EditText editname,editaddress,editph_no;

Button btn_adddata;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.insert_patient, container, false);

    mydb = new DBHandler(getActivity());

    editname=(EditText) rootView.findViewById(R.id.insert_name);
    editname=(EditText) rootView.findViewById(R.id.insert_address);
    editname=(EditText) rootView.findViewById(R.id.insert_ph_no);
    btn_adddata=(Button) rootView.findViewById(R.id.insert_button);
    btn_adddata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            adddata();
        }
    });
    return rootView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mydb = new DBHandler(getActivity());
}
public void adddata()
{
    mydb = new DBHandler(getActivity());
    Toast.makeText(getActivity(), "working button", Toast.LENGTH_LONG).show();
   try {

       boolean isinserted = mydb.insertData(editname.getText().toString(), editaddress.getText().toString(), editph_no.getText().toString());

       if (isinserted) {
           Toast.makeText(getActivity(), "data saved", Toast.LENGTH_LONG).show();
       } else {
           Toast.makeText(getActivity(), "data Not saved", Toast.LENGTH_LONG).show();
       }
   }
   catch (Exception e) {
       Toast.makeText(getActivity(), String.valueOf(e), Toast.LENGTH_LONG).show();
   }
}
}

我已经应用了很多解决方案,比如初始化或不初始化按钮,getactivity(),getcontext()和getbasecontext()用于初始化dbhandler对象,也在我的数据库处理程序中使用不同的解决方案进行了很多更改但仍然有相同的错误。我没有检查我的活动解决方案,因为我正在使用片段类,所以我只尝试了它。

2 个答案:

答案 0 :(得分:2)

你的问题就是你得到的所有editText被分配给editname而不是你需要的那些,而你正在使用他们的getText方法。

在您的insertPatient类中:

editname=(EditText) rootView.findViewById(R.id.insert_name);
editname=(EditText) rootView.findViewById(R.id.insert_address);
editname=(EditText) rootView.findViewById(R.id.insert_ph_no);

为:

editname=(EditText) rootView.findViewById(R.id.insert_name);
editaddress=(EditText) rootView.findViewById(R.id.insert_address);
editph_no=(EditText) rootView.findViewById(R.id.insert_ph_no);

答案 1 :(得分:-1)

您尚未初始化 editaddress editph_no 。您只是使用diff ids初始化 editname 三次。 请参阅代码中的以下行

editname=(EditText) rootView.findViewById(R.id.insert_name);
editname=(EditText) rootView.findViewById(R.id.insert_address);
editname=(EditText) rootView.findViewById(R.id.insert_ph_no);

你从editaddress和editph_no获得价值,它会抛出异常

boolean isinserted = mydb.insertData(editname.getText().toString(), editaddress.getText().toString(), editph_no.getText().toString());

将这些行编辑为

editname=(EditText) rootView.findViewById(R.id.insert_name);
editaddress =(EditText) rootView.findViewById(R.id.insert_address);
editph_no =(EditText) rootView.findViewById(R.id.insert_ph_no);