Android mendapatkan java.lang.NullPointerException dalam fungsi DatabaseHandler

dengan fungsi sederhana ini saya ingin menyimpan catatan ke dalam database tetapi saya mendapatkan kesalahan ini:

java.lang.NullPointerException 

untuk baris ini:

SQLiteDatabase db = this.getWritableDatabase();

Kelas DatabaseHandler lengkap saya:

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
    }
}

panggilan dan gunakan:

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])));

POSTINGAN DIPERBARUI

Kelas TSMS dengan metode penyimpanan di database:

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 kelas:

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 sumber
comment
kemungkinan duplikat nullPointerException untuk SQLiteOpenHelper.getWritableDatabase(), Android   -  person Jens    schedule 30.08.2014
comment
@TuxWorld dapatkah Anda menunjukkan kepada saya bagaimana Anda menginisialisasi kelas TSMS dalam aktivitas Anda ..karena menurut saya Anda masih belum menyelesaikan pertanyaan terakhir Anda dengan benar..   -  person Ranjit    schedule 30.08.2014
comment
Bisakah Anda memberi kami stacktrace lengkap?   -  person hoomi    schedule 30.08.2014
comment
@RanjitPati memperbarui postingan Pak.   -  person DolDurma    schedule 30.08.2014
comment
@TuxWorld Saya hanya ingin melihat aktivitas mana yang Anda tulis atau inisialisasi kelas ReceiveFields seperti ReceiveFields obj = new ReceiveFields(context) ..saya tidak menemukan yang ini di kelas ini..   -  person Ranjit    schedule 30.08.2014
comment
Apakah Anda menggunakan kode ini DatabaseHandler db = new DatabaseHandler(context); dalam aktivitasmu?   -  person Piyush    schedule 30.08.2014
comment
@PG_Android Saya menggunakan penyimpanan di kelas Java bukan suatu aktivitas   -  person DolDurma    schedule 30.08.2014
comment
@TuxWorld Periksa jawaban saya sekarang.   -  person Piyush    schedule 30.08.2014


Jawaban (2)


Ubah konstruktor kelas TSMS Anda

public TSMS(Context context , User user) {
    this.user = user;
    this.context = context;
}
person Piyush    schedule 30.08.2014
comment
setelah mengubah konstruktor saya mendapatkan kesalahan null: java.lang.NullPointerException untuk SQLiteDatabase db = this.getWritableDatabase(); - person DolDurma; 30.08.2014
comment
Di kelas manakah baris ini menunjukkan kesalahan SQLiteDatabase db = this.getWritableDatabase();? - person Piyush; 30.08.2014
comment
di kelas DatabaseHandler. saya mengubah konstruktor menjadi: 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
Saya rasa baris ini tidak benar di kelas TSMS` : DatabaseHandler db = new DatabaseHandler(context); untuk konstruktor ini: DatabaseHandler(Context context) di kelas DataBaseHandler - person DolDurma; 30.08.2014
comment
Anda cukup menggunakan variabel konteks itu untuk DatabaseHandler db = new DatabaseHandler(context); yang telah Anda deklarasikan secara global di kelas TSMS - person Piyush; 30.08.2014
comment
kode saya DatabaseHandler db = new DatabaseHandler(context); mengapa saya mendapatkan NULL sekarang? - person DolDurma; 30.08.2014
comment
sudahkah Anda mengubah konstruktor kelas TSMS sama dengan jawaban saya? - person Piyush; 30.08.2014
comment
Maaf, saya mendapatkan kesalahan ini sekarang. java.lang.IllegalStateException: getWritableDatabase called recursively bisakah saya menempelkan file untuk memeriksanya? - person DolDurma; 30.08.2014
comment
Mari kita melanjutkan diskusi ini dalam chat. - person DolDurma; 30.08.2014
comment
Periksa stackoverflow.com/questions/9547259/ - person Piyush; 30.08.2014

dari pertanyaan terakhir Anda dan dari ini pertanyaan

Sejauh pengetahuan saya, saya rasa Anda masih belum yakin tentang Konteks di Android .

Beberapa saran untuk mengatasi akar masalah Anda:

1) Di konstruktor ReceiveFields() Anda cukup menggunakan variabel konteks untuk mengatasi kesalahan seperti di bawah ini..

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

Dan di sini Anda dapat menggunakan solusi PG_Android untuk memperbaiki kesalahan tetapi Anda masih belum menyelesaikan masalah akar Anda jika Anda tidak meneruskan konteks utama dari aktivitas Anda.

Cukup periksa aktivitas utama Anda dari mana Anda memanggil/menginisialisasi kelas utama (saya pikir TSMS) dan berikan konteks yang tepat untuk memperbaiki masalah utama seperti:

 TSMS obj = new TSMS(your_current_activity.this);

di sini your_current_activity.this Anda akan berfungsi sebagai konteks utama di semua kelas dan database Anda.. saya rasa Anda mengerti..

person Ranjit    schedule 30.08.2014
comment
setelah membaca komentar PG_Android, memposting dan mengubah konstruktor saya menggunakan tsms = new TSMS(context,new User(this.username, this.password)); sekarang tetapi setelah menjalankan aplikasi untuk menyimpan ke database saya mendapatkan kesalahan Null - person DolDurma; 30.08.2014
comment
Untuk itu cukup periksa beberapa di mana Anda tidak mendapatkan nilai untuk dimasukkan ke dalam database. - person Piyush; 30.08.2014
comment
@TuxWorld Dalam TSMS(context,new User(this.username, this.password)) ..2 parameter baik-baik saja..tetapi Anda harus memastikan parameter pertama (yaitu konteks) harus memegang konteks aktivitas..seperti yang saya sarankan dalam jawaban saya..yaitu your_activity.this - person Ranjit; 30.08.2014
comment
@RanjitPati saya mengubahnya setelah melihat komentar Anda - person DolDurma; 30.08.2014