Android รับ java.lang.NullPointerException ในฟังก์ชัน DatabaseHandler

ด้วยฟังก์ชันง่ายๆ นี้ ฉันต้องการบันทึกบันทึกลงในฐานข้อมูล แต่ฉันได้รับข้อผิดพลาดนี้:

java.lang.NullPointerException 

สำหรับบรรทัดนี้:

SQLiteDatabase db = this.getWritableDatabase();

คลาส DatabaseHandler ทั้งหมดของฉัน:

public class DatabaseHandler extends SQLiteOpenHelper{
        private static String DB_PATH                   = "";
        private static final String DATABASE_NAME       = "tsms";
        private static String RECEIVE_FIELDS_TABLE      = "ReceiveFields";
        private static final String COLUMN_ID           = "id";
        private static final String COLUMN_LASTID       = "lastId";
        private static final String COLUMN_SMSNUMBER    = "smsNumber";
        private static final String COLUMN_MOBILENUMBER = "mobileNumber";
        private static final String COLUMN_SENDERNAME   = "senderName";
        private static final String COLUMN_SMSBODY      = "smsBody";
        private static final String COLUMN_RECEIVEDATE  = "receiveDate";
        private static final int DATABASE_VERSION = 1;
        private SQLiteDatabase mDataBase;
        private static final String DATABASE_CREATE = "CREATE TABLE " + RECEIVE_FIELDS_TABLE + "("
                + COLUMN_ID           + " INTEGER NOT NULL  UNIQUE , "
                + COLUMN_LASTID       + " INTEGER NOT NULL  UNIQUE , "
                + COLUMN_SMSNUMBER    + " INTEGER NOT NULL  UNIQUE , "
                + COLUMN_MOBILENUMBER + " INTEGER NOT NULL , "
                + COLUMN_SENDERNAME   + " VARCHAR NOT NULL , "
                + COLUMN_SMSBODY      + " TEXT NOT NULL  check(typeof(" + COLUMN_SMSBODY + ") = 'text') , "
                + COLUMN_RECEIVEDATE  + " DATETIME NOT NULL , PRIMARY KEY (" + COLUMN_ID + ", " + COLUMN_LASTID + ", " + COLUMN_SMSNUMBER + "))";

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + RECEIVE_FIELDS_TABLE);

        // Create tables again
        onCreate(sqLiteDatabase);
    }

    // Adding new fields
    public void addToReceived(ReceiveFields fields) {

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put(COLUMN_LASTID,       fields.getLastId());           // ReceiveFields last ID
        values.put(COLUMN_MOBILENUMBER, fields.getMobileNumber());     // ReceiveFields Mobile Number
        values.put(COLUMN_SENDERNAME,   fields.getSenderName());       // ReceiveFields Mobile Number
        values.put(COLUMN_SMSBODY,      fields.getSmsBody());          // ReceiveFields Mobile Number
        values.put(COLUMN_SMSNUMBER,    fields.getSmsNumber());        // ReceiveFields Mobile Number
        values.put(COLUMN_MOBILENUMBER, fields.getMobileNumber());     // ReceiveFields Mobile Number
        values.put(COLUMN_RECEIVEDATE,  String.valueOf(fields.getReceiveDate())); // ReceiveFields Mobile Number

        // Inserting Row
        db.insert(RECEIVE_FIELDS_TABLE, null, values);

        db.close(); // Closing database connection
    }
}

โทรและใช้:

DatabaseHandler db = new DatabaseHandler(context);

db.addToReceived(new ReceiveFields(

                            Long.valueOf(str1[0]),

                            str1[1],

                            str1[2],

                            URLDecoder.decode(str1[3], "UTF-8"),

                            URLDecoder.decode(str1[4], "UTF-8"),

                            WSDLHelper.convertDate(str1[5])));

โพสต์ที่อัปเดต

TSMS คลาสพร้อมวิธีบันทึกบนฐานข้อมูล:

public class TSMS {

    private User user;

    public SoapObject SoapObjectRequest;
    private Context context;

    public TSMS(User user) {
        this.user = user;
    }

    public Boolean checkUserAuth() throws TException{

        SoapObject request = new SoapObject(Strings.URL_TSMS , Strings.NAME_METHOD_IS_FROM_USERS);

        this.SoapObjectRequest = request;

        request.addProperty("userName", this.user.userName);

        request.addProperty("passWord", this.user.passWord);

        LoginFields loginSoapParser = SoapParser(WSDLHelper.convert1(WSDLHelper.call(request)));

        if ( loginSoapParser.ckeckAuth){

            return true;

        }
        else{

            return false;

        }
    }
    public LoginFields SoapParser(String result){

        String receiveResult = result;

        String split[] = result.split(",");

        LoginFields loginFields = new LoginFields();

        String numbers = split[2].trim();

        String removeBracket = numbers.substring(1, numbers.length() - 1);

        String items[] = removeBracket.split(";");

        StringBuilder panelNumbers = new StringBuilder();

        for( int i=0; i < items.length; i++){

            String r = items[i].replaceAll("[item=]","").trim();

            panelNumbers.append( r );

        }

        loginFields.ckeckAuth = (Integer.valueOf(split[0]) == 1 ) ? true : false;

        loginFields.balance   =  Integer.valueOf( split[1].trim() );

        loginFields.panelNumbers = panelNumbers;

        return  loginFields;

    }
    public List<ReceiveFields> getReceivedSMS(long idToDown, long count) throws TException {

        SoapObject request = new SoapObject(Strings.URL_TSMS , Strings.NAME_METHOD_GET_RECEIVE_MESSAGE);

        request.addProperty("userName", this.user.userName);

        request.addProperty("passWord", this.user.passWord);

        request.addProperty("idToDown", idToDown);

        request.addProperty("count_request", count);

        String str = WSDLHelper.call(request);

        String[] strings = WSDLHelper.convert2(WSDLHelper.convert1(str));

        List<ReceiveFields> receiveArray = new ArrayList<ReceiveFields>();

        DatabaseHandler db = new DatabaseHandler(context);

        if (strings != null) {

            for (int i = 0; i <= strings.length - 1; i++) {

                String[] str1 = WSDLHelper.convert3(strings[i]);

                try {

                    receiveArray.add(new ReceiveFields(

                            Long.valueOf(str1[0]),

                            str1[1],

                            str1[2],

                            URLDecoder.decode(str1[3], "UTF-8"),

                            URLDecoder.decode(str1[4], "UTF-8"),

                            WSDLHelper.convertDate(str1[5])));

                    db.addToReceived(new ReceiveFields(

                            Long.valueOf(str1[0]),

                            str1[1],

                            str1[2],

                            URLDecoder.decode(str1[3], "UTF-8"),

                            URLDecoder.decode(str1[4], "UTF-8"),

                            WSDLHelper.convertDate(str1[5])));

                }

                catch (UnsupportedEncodingException ex) {

                    throw new TException(PublicErrorList.NOT_EXIST_ERROR_DETAIL);

                }
            }
        }
        return receiveArray;
    }
    public String sendSms( SendSms sms )  throws TException {
        SoapObject request = new SoapObject(Strings.URL_TSMS , Strings.NAME_METHOD_SEND_MESSAGE);
        request.addProperty("user", this.user.userName);
        request.addProperty("pass", this.user.passWord);
        request.addProperty("sms_number", sms.senderNumber);
        request.addProperty("mobile", sms.receiverNumber);
        request.addProperty("msg", sms.text);
        request.addProperty("send_date", WSDLHelper.convertDate( sms.dateTime) );
        return WSDLHelper.call(request);
    }
}

User คลาส:

public class User {
    public String userName;
    public String passWord;

    public User(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }
}

person DolDurma    schedule 30.08.2014    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ nullPointerException สำหรับ SQLiteOpenHelper.getWritableDatabase(), Android   -  person Jens    schedule 30.08.2014
comment
@TuxWorld คุณช่วยแสดงให้ฉันเห็นว่าคุณเริ่มต้นคลาส TSMS ในกิจกรรมของคุณได้อย่างไร .. เพราะฉันคิดว่าคุณยังคงแก้ไขคำถามสุดท้ายของคุณไม่ถูกต้อง ..   -  person Ranjit    schedule 30.08.2014
comment
โปรดให้ stacktrace แบบเต็มแก่เราได้ไหม   -  person hoomi    schedule 30.08.2014
comment
@RanjitPati อัปเดตโพสต์แล้วครับ   -  person DolDurma    schedule 30.08.2014
comment
@TuxWorld ฉันแค่อยากจะดูว่ากิจกรรมใดที่คุณเขียนหรือเริ่มต้นคลาส ReceiveFields เช่น ReceiveFields obj = new ReceiveFields(context) .. ฉันไม่พบสิ่งนี้ในคลาสนี้ ..   -  person Ranjit    schedule 30.08.2014
comment
คุณใช้รหัสนี้ DatabaseHandler db = new DatabaseHandler(context); ในกิจกรรมของคุณ?   -  person Piyush    schedule 30.08.2014
comment
@PG_Android ฉันใช้บันทึกในคลาส java ไม่ใช่กิจกรรม   -  person DolDurma    schedule 30.08.2014
comment
@TuxWorld ตรวจสอบคำตอบของฉันตอนนี้   -  person Piyush    schedule 30.08.2014


คำตอบ (2)


เปลี่ยนคอนสตรัคเตอร์คลาส TSMS ของคุณ

public TSMS(Context context , User user) {
    this.user = user;
    this.context = context;
}
person Piyush    schedule 30.08.2014
comment
หลังจากเปลี่ยน Constructor ฉันได้รับข้อผิดพลาด null: java.lang.NullPointerException สำหรับ SQLiteDatabase db = this.getWritableDatabase(); - person DolDurma; 30.08.2014
comment
บรรทัดนี้แสดงข้อผิดพลาด SQLiteDatabase db = this.getWritableDatabase(); ในคลาสใด - person Piyush; 30.08.2014
comment
ในคลาส DatabaseHandler ฉันเปลี่ยนตัวสร้างเป็น: public DatabaseHandler(Context context,String DB_NAME, int Version) { super(context, DB_NAME, null, Version); this.context = context; } public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } - person DolDurma; 30.08.2014
comment
ฉันคิดว่าบรรทัดนี้ของฉันไม่ถูกต้องใน TSMS class` : DatabaseHandler db = new DatabaseHandler(context); สำหรับตัวสร้างนี้: DatabaseHandler(Context context) ใน DataBaseHandler คลาส - person DolDurma; 30.08.2014
comment
คุณต้องใช้ตัวแปรบริบทนั้นสำหรับ DatabaseHandler db = new DatabaseHandler(context); ซึ่งคุณได้ประกาศไว้ทั่วโลกในคลาส TSMS - person Piyush; 30.08.2014
comment
รหัสของฉันคือ DatabaseHandler db = new DatabaseHandler(context); ทำไมฉันถึงได้ NULL ตอนนี้ - person DolDurma; 30.08.2014
comment
คุณเปลี่ยนตัวสร้างคลาส TSMS เหมือนกับคำตอบของฉันแล้วหรือยัง? - person Piyush; 30.08.2014
comment
ขออภัย ฉันได้รับข้อผิดพลาดนี้แล้ว java.lang.IllegalStateException: getWritableDatabase called recursively ฉันสามารถวางไฟล์เพื่อตรวจสอบได้หรือไม่ - person DolDurma; 30.08.2014
comment
ให้เราสนทนาต่อในการแชท - person DolDurma; 30.08.2014
comment
ตรวจสอบ stackoverflow.com/questions/9547259/ - person Piyush; 30.08.2014

จากคำถามสุดท้ายของคุณ และจากนี้ คำถาม

เท่าที่ฉันรู้ ฉันคิดว่าคุณยังไม่แน่ใจเกี่ยวกับ บริบทใน android

คำแนะนำบางประการในการแก้ปัญหารากของคุณ:

1) ใน ReceiveFields() Constructor คุณเพียงแค่ใช้ตัวแปรบริบทเพื่อแก้ไขข้อผิดพลาดดังนี้

Context ctx = null;
public ReceiveFields(Context ctx){
  this.ctx=ctx; //create a field Context ctx;
}

และที่นี่คุณสามารถใช้วิธีแก้ปัญหาของ PG_Android เพื่อแก้ไขข้อผิดพลาด แต่คุณยังคงไม่สามารถแก้ปัญหาต้นตอของคุณได้ หากคุณไม่ส่งผ่านบริบทหลักจากกิจกรรมของคุณ

เพียงตรวจสอบกิจกรรมหลักของคุณจากที่ที่คุณโทร/เริ่มต้นคลาสหลัก (ฉันคิดว่า TSMS) และส่งบริบทที่เหมาะสมเพื่อแก้ไขปัญหาหลักเช่น:

 TSMS obj = new TSMS(your_current_activity.this);

ที่นี่ your_current_activity.this ของคุณจะทำงานเป็นบริบทหลักในชั้นเรียนและฐานข้อมูลทั้งหมดของคุณ .. ฉันคิดว่าคุณเข้าใจ ..

person Ranjit    schedule 30.08.2014
comment
หลังจากอ่านความคิดเห็น PG_Android โพสต์และเปลี่ยนคอนสตรัคเตอร์ ฉันใช้ tsms = new TSMS(context,new User(this.username, this.password)); ตอนนี้ แต่หลังจากรันแอปพลิเคชันเพื่อบันทึกลงในฐานข้อมูล ฉันได้รับข้อผิดพลาด Null - person DolDurma; 30.08.2014
comment
เพื่อสิ่งนั้นเพียงตรวจสอบบางจุดที่คุณไม่ได้รับค่าที่จะแทรกในฐานข้อมูล - person Piyush; 30.08.2014
comment
@TuxWorld ใน TSMS(context,new User(this.username, this.password)) .. พารามิเตอร์ที่ 2 ใช้ได้ .. แต่คุณต้องแน่ใจว่าพารามิเตอร์ที่ 1 (เช่นบริบท) จะต้องเก็บบริบทของกิจกรรม .. เหมือนที่ฉันแนะนำในคำตอบของฉัน .. i.e your_activity.this - person Ranjit; 30.08.2014
comment
@RanjitPati ฉันเปลี่ยนหลังจากเห็นความคิดเห็นของคุณ - person DolDurma; 30.08.2014