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
Можете ли вы предоставить нам полную трассировку стека, пожалуйста?   -  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
после конструктора изменений я получаю ошибку 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
Проверьте эти -a-record-in-ocreate-of-my-dbhelper-cl" title="java lang absolutestateexceptiongetwritabledatabase вызывается рекурсивно%2chttp%3a"> stackoverflow.com/questions/9547259/ - person Piyush; 30.08.2014

из вашего последнего вопроса и из этого вопрос

Насколько мне известно, я думаю, вы все еще не уверены в Context in android.

Некоторые предложения по решению вашей основной проблемы:

1) В конструкторе ReceiveFields() вы просто используете контекстную переменную для устранения ошибки, как показано ниже.

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-й параметр (то есть контекст) должен содержать контекст действия. - person Ranjit; 30.08.2014
comment
@RanjitPati, я поменяю это после того, как увижу твой комментарий - person DolDurma; 30.08.2014