Bonjour à tous !
Je suis en train de créer une application de planning. Je vais stocker toutes les infos dans une base SQLite mais je débute en base de données...

J'ai pas mal avancé mais là, je butte bêtement sur un NullPointerException que je ne comprends pas. Je suis peut-être miro, mdr.

Le message du Logcat est le suivant : "java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xxx.test3.PlanDBHelper.addDays(com.xxx.test3.Days)' on a null object reference at com.xxx.test3.AddActivity$1.onClick(AddActivity.java:55)". Mais en fait je ne vois pas quelle variable peut bien être null...

Voici le code de ma classe AddActivity :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package com.xxx.test3;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.Toast;
 
public class AddActivity extends AppCompatActivity {
 
    private EditText editDate;
    private EditText editTS;
    private EditText editPro;
    private EditText editInco;
    private EditText editHSynd;
    private Spinner spinPoste;
    private Spinner spinFonc;
    private Spinner spinSect;
    private Spinner spinHRapp;
 
    private Button validate;
    private ImageButton buttExit;
 
    private String poste, fonction, secteur;
    private double ts;
    private double pro;
    private double inco;
    private double hsynd;
    private int rappels;
 
    private CharSequence text;
    private int error = 1;
    private PlanDBHelper mDatabase;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
 
        validate = findViewById(R.id.validate);
        validate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                error = 0;
                recupInfos();
                if (error == 0) {
                    Days newDay = new Days(poste, fonction, secteur, ts, pro, inco, rappels, hsynd);
                    mDatabase.addDays(newDay);   // C'est cette ligne qui pose problème !
                    text = "Poste ajouté !";
                    toasts(text);
                    AddActivity.this.finish(); }
            }
        });
 
        buttExit = findViewById(R.id.buttExit);
        buttExit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AddActivity.this.finish();
            }
        });
    }
 
    private void recupInfos() {
        editDate = findViewById(R.id.editDate);
        editTS = findViewById(R.id.editTS);
        editPro = findViewById(R.id.editPro);
        editInco = findViewById(R.id.editInco);
        editHSynd = findViewById(R.id.editHSynd);
        spinPoste = findViewById(R.id.spinPoste);
        spinFonc = findViewById(R.id.spinFonc);
        spinSect = findViewById(R.id.spinSect);
        spinHRapp = findViewById(R.id.spinHRapp);
 
        String valTS = editTS.getText().toString();
        if (TextUtils.isEmpty(valTS)) {ts = 0d;}
        else {
            try {
                ts = Double.valueOf(valTS);
            } catch (NumberFormatException e) {
                text = "Entrez une valeur numérique pour les travaux sales";
                toasts(text);
                error = 1;
            }
        }
 
        String valPro = editPro.getText().toString();
        if (TextUtils.isEmpty(valPro)) {pro = 0d;}
        else {
            try {
                pro = Double.valueOf(valPro);
            } catch (NumberFormatException e) {
                text = "Entrez une valeur numérique pour la prolongation de poste";
                toasts(text);
                error = 1;
            }
        }
 
        String valInco = editInco.getText().toString();
        if (TextUtils.isEmpty(valInco)) {inco = 0d;}
        else {
            try {
                inco = Double.valueOf(valInco);
            } catch (NumberFormatException e) {
                text = "Entrez une valeur numérique pour les incommodités";
                toasts(text);
                error = 1;
            }
        }
 
        String valSynd = editHSynd.getText().toString();
        if (TextUtils.isEmpty(valSynd)) {hsynd = 0d;}
        else {
            try {hsynd = Double.valueOf(valSynd);}
            catch (NumberFormatException e) {
                text = "Entrez une valeur numérique pour les heures syndicales";
                toasts(text);
                error = 1;
            }
        }
 
        String valHRapp = spinHRapp.getSelectedItem().toString();
        rappels = Integer.valueOf(valHRapp);
 
        poste = spinPoste.getSelectedItem().toString();
        if (poste.equals("-Choix du poste-")) {
            text = "Sélectionnez un poste";
            toasts(text);
            error = 1;
        }
        fonction = spinFonc.getSelectedItem().toString();
        if (fonction.equals("-Choix de la fonction-")) {
            text = "Sélectionnez une fonction";
            toasts(text);
            error = 1;
        }
        secteur = spinSect.getSelectedItem().toString();
        if (secteur.equals("-Secteur-")) {
            text = "Sélectionnez un secteur";
            toasts(text);
            error = 1;
        }
    }
 
    private void toasts(CharSequence text) {
        Context context = getApplicationContext();
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
    }
}
celui de la classe PlanDBHelper :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.xxx.test3;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
 
public class PlanDBHelper extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "planlist.db";
    private static final String TABLE_DAYS = "Days";
    private static final String COLUMN_ID = "_id";
    private static final String COLUMN_POSTE = "dayPoste";
    private static final String COLUMN_FONCTION = "dayFonction";
    private static final String COLUMN_SECTEUR = "daySecteur";
    private static final String COLUMN_TS = "dayTS";
    private static final String COLUMN_PRO = "dayPro";
    private static final String COLUMN_INCO = "dayInco";
    private static final String COLUMN_RAPP = "dayRapp";
    private static final String COLUMN_SYND = "daySynd";
    public PlanDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_PLANLIST_TABLE = "CREATE TABLE "
                + TABLE_DAYS + "(" + COLUMN_ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COLUMN_POSTE + " TEXT NOT NULL,"
                + COLUMN_FONCTION + " TEXT NOT NULL,"
                + COLUMN_SECTEUR + " TEXT NOT NULL,"
                + COLUMN_TS + " REAL NOT NULL,"
                + COLUMN_PRO + " REAL NOT NULL,"
                + COLUMN_INCO + " REAL NOT NULL,"
                + COLUMN_RAPP + " INTEGER NOT NULL,"
                + COLUMN_SYND + " REAL NOT NULL" + ")";
        db.execSQL(CREATE_PLANLIST_TABLE);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_DAYS);
        onCreate(db);
    }
    public ArrayList<Days> listDays() {
        String sql = "select * from " + TABLE_DAYS;
        SQLiteDatabase db = this.getReadableDatabase();
        ArrayList<Days> storeDays = new ArrayList<>();
        Cursor cursor = db.rawQuery(sql, null);
        if (cursor.moveToFirst()) {
            do {
                int id = Integer.parseInt(cursor.getString(0));
                String poste = cursor.getString(1);
                String fonction = cursor.getString(2);
                String secteur = cursor.getString(3);
                Double ts = Double.valueOf(cursor.getString(4));
                Double pro = Double.valueOf(cursor.getString(5));
                Double inco = Double.valueOf(cursor.getString(6));
                int rapp = Integer.parseInt(cursor.getString(7));
                Double synd = Double.valueOf(cursor.getString(8));
                storeDays.add(new Days(id, poste, fonction, secteur, ts, pro, inco, rapp, synd));
            }
            while (cursor.moveToNext());
        }
        cursor.close();
        return storeDays;
    }
    void addDays(Days days) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_POSTE, days.getPoste());
        values.put(COLUMN_FONCTION, days.getFonction());
        values.put(COLUMN_SECTEUR, days.getSecteur());
        values.put(COLUMN_TS, days.getTS());
        values.put(COLUMN_PRO, days.getPro());
        values.put(COLUMN_INCO, days.getInco());
        values.put(COLUMN_RAPP, days.getRapp());
        values.put(COLUMN_SYND, days.getSynd());
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(TABLE_DAYS, null, values);
    }
    void updateDays(Days days) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_POSTE, days.getPoste());
        values.put(COLUMN_FONCTION, days.getFonction());
        values.put(COLUMN_SECTEUR, days.getSecteur());
        values.put(COLUMN_TS, days.getTS());
        values.put(COLUMN_PRO, days.getPro());
        values.put(COLUMN_INCO, days.getInco());
        values.put(COLUMN_RAPP, days.getRapp());
        values.put(COLUMN_SYND, days.getSynd());
        SQLiteDatabase db = this.getWritableDatabase();
        db.update(TABLE_DAYS, values, COLUMN_ID + " = ?", new String[]{String.valueOf(days.getId())});
    }
    void deleteDay(int id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_DAYS, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
    }
}
et enfin celui de la classe Days :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.xxx.test3;
 
public class Days {
    private int id;
    private String poste;
    private String fonction;
    private String secteur;
    private Double ts;
    private Double pro;
    private Double inco;
    private int rapp;
    private Double synd;
 
    Days(String poste, String fonction, String secteur, Double ts, Double pro, Double inco, int rapp, Double synd) {
        this.poste = poste;
        this.fonction = fonction;
        this.secteur = secteur;
        this.ts = ts;
        this.pro = pro;
        this.inco = inco;
        this.rapp = rapp;
        this.synd = synd;
    }
 
    Days(int id, String poste, String fonction, String secteur, Double ts, Double pro, Double inco, int rapp, Double synd) {
        this.id = id;
        this.poste = poste;
        this.fonction = fonction;
        this.secteur = secteur;
        this.ts = ts;
        this.pro = pro;
        this.inco = inco;
        this.rapp = rapp;
        this.synd = synd;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getPoste() {
        return poste;
    }
 
    public void setPoste(String poste) {
        this.poste = poste;
    }
 
    public String getFonction() {
        return fonction;
    }
 
    public void setFonction(String fonction) {
        this.fonction = fonction;
    }
 
    public String getSecteur() {
        return secteur;
    }
 
    public void setSecteur(String secteur) {
        this.secteur = secteur;
    }
 
    public Double getTS() {
        return ts;
    }
 
    public void setTS(Double ts) {
        this.ts = ts;
    }
 
    public Double getPro() {
        return pro;
    }
 
    public void setPro(Double pro) {
        this.pro = pro;
    }
 
    public Double getInco() {
        return inco;
    }
 
    public void setInco(Double inco) {
        this.inco = inco;
    }
 
    public int getRapp() {
        return rapp;
    }
 
    public void setRapp(int rapp) {
        this.rapp = rapp;
    }
 
    public Double getSynd() {
        return synd;
    }
 
    public void setSynd(Double synd) {
        this.synd = synd;
    }
}
Petites précisions :
- les valeurs des editText sont bien récupérées car j'arrive à les faire sortir dans le Logcat via System.out.println.
- j'ai constaté également que la base de données est bien créé, elle contient la table avec les colonnes mais par contre elle ne contient aucune donnée.

Voilà, je vous remercie infiniment pour votre aide !