Bonjour à tous. Pour un projet perso en Android démarré pendant cette période de confinement, je cherche à ouvrir un Agenda depuis une Activité à partir sur un bouton.
Dans la fonction qui pose le calendrier, je récupère également des évènements depuis une base de données SQLite et j'ouvre donc une base avec la fonction getReadableDatabase.

Tout semble fonctionner quand j'ouvre l'activité Calendrier directement en en faisant l'activité principale depuis mon Manifest et dans ce cas la base de données ne renvoie pas d'erreur.

Pourtant, quand je lance l'activité depuis une autre activité avec un Intent depuis mon écouteur de click, l'application crash et me renvoie comme message d'erreur que la base de données est "locked" :

J'ai essayé différentes méthodes telles que

Quand je lance l'activité

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
     newRdv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                Toast.makeText(PatientFolderActivity.this, "PETER DIAMANDIS & RAY KURZWEIL", Toast.LENGTH_LONG).show();
 
                Intent intent = new Intent(PatientFolderActivity.this, CustomCalendarActivity.class);
 
                startActivity(intent);
 
            }
        });
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
public class CustomCalendarActivity extends AppCompatActivity {
 
    private static final String TAG = CustomCalendarActivity.class.getSimpleName();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_calendar);
        CalendarCustomView mView = findViewById(R.id.custom_calendar);
    }
 
}
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
 
 
 private void setUpCalendarAdapter() {
 
        String currwntDate = formatter.format(cal.getTime());
 
        currentDate.setText(currwntDate);
        dates.clear();
        //List<Date> dayValueInCells = new ArrayList<Date>();
        dbOpenHelper = new Database(context);
        //DatabaseQuery mQuery = new DatabaseQuery(context);
 
        //dbOpenHelper = Database.getInstance(context);
 
        List<EventObjects> mEvents = dbOpenHelper.getAllFutureEvents();
 
        //int mEvents = CalendarCustomView.this.openDatabase().getAllFutureEvents();
 
        Calendar mCal = (Calendar)cal.clone();
 
        mCal.set(Calendar.DAY_OF_MONTH, 1);
 
        int FirstDayOfTheMonth = mCal.get(Calendar.DAY_OF_WEEK) - 1;
 
        mCal.add(Calendar.DAY_OF_MONTH, -FirstDayOfTheMonth);
        //CollectEventsPerMonth(monthFormat.format(cal.getTime()), yearFormate.format(cal.getTime()));
 
        while(dates.size() < MAX_CALENDAR_COLUMN) {
 
            dates.add(mCal.getTime());
            mCal.add(Calendar.DAY_OF_MONTH, 1);
 
        }
 
        Log.d(TAG, "Number of date " + dates.size());
 
        //String sDate = formatter.format(cal.getTime());
        //currentDate.setText(sDate);
 
        mAdapter = new GridAdapter(context, dates, cal, mEvents);
        //mAdapter = new GridAdapter(context, dates, cal);
        calendarGridView.setAdapter(mAdapter);
 
    }
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
 
 
 public List<EventObjects> getAllFutureEvents() {
        Date dateToday = new Date();
        List<EventObjects> events = new ArrayList<>();
        String query = "select * from " + TABLE_EVENTS + "";
        //String query1 = "SELECT * FROM " + TABLE_EVENTS;
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery(query, null);
 
        if(cursor.moveToFirst()){
            do{
                int id = cursor.getInt(0);
                String event = cursor.getString(cursor.getColumnIndexOrThrow("event"));
                String date = cursor.getString(cursor.getColumnIndexOrThrow("date"));
                String time = cursor.getString(cursor.getColumnIndexOrThrow("time"));
                String month = cursor.getString(cursor.getColumnIndexOrThrow("month"));
                String year = cursor.getString(cursor.getColumnIndexOrThrow("year"));
 
                Date reminderDate = convertStringToDate(date);
 
                if(reminderDate.after(dateToday) || reminderDate.equals(dateToday)) {
                    events.add(new EventObjects(id, event, date, time, month, year));
                }
            }
            while (cursor.moveToNext());
        }
        cursor.close();
        db.close();
 
        return events;
 
    }
Ayant trouvé sur Internet, que mon problème pourrait être en rapport avec le multithreading, j'ai tenté de transformer ma classe SQLiteOpenHelper en singleton :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
    private static Database sInstance;
 
 
    public static synchronized Database getInstance(Context context) {
 
        if (sInstance == null) {
            sInstance = new Database(context.getApplicationContext());
        }
 
        return sInstance;
    }
Et d'ouvrir la connection ainsi depuis ma fonction setUpCalendarAdapter

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
 
dbOpenHelper = Database.getInstance(context);
Pourtant, çà ne semble pas mieux fonctionner et je reçois encore cette erreur :

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
 
 
E/SQLiteLog: (5) database is locked
E/SQLiteDatabase: Failed to open database '/data/user/0/com.example.testcovid/databases/ wozniak '.
    android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:635)
        at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:321)
        at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:295)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:216)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
        at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:200)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:192)
        at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:864)
        at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:849)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:724)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:295)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
        at com.example.testcovid.Database.getAllFutureEvents(Database.java:434)
        at com.example.testcovid.CalendarCustomView.setUpCalendarAdapter(CalendarCustomView.java:375)
        at com.example.testcovid.CalendarCustomView.<init>(CalendarCustomView.java:82)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.example.testcovid.CustomCalendarActivity.onCreate(CustomCalendarActivity.java:18)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
E/SQLiteOpenHelper: Couldn't open  wozniak  for writing (will try read-only):
    android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:635)
        at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:321)
        at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:295)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:216)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
        at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:200)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:192)
        at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:864)
        at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:849)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:724)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:295)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
        at com.example.testcovid.Database.getAllFutureEvents(Database.java:434)
        at com.example.testcovid.CalendarCustomView.setUpCalendarAdapter(CalendarCustomView.java:375)
        at com.example.testcovid.CalendarCustomView.<init>(CalendarCustomView.java:82)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.example.testcovid.CustomCalendarActivity.onCreate(CustomCalendarActivity.java:18)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testcovid, PID: 5405
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testcovid/com.example.testcovid.CustomCalendarActivity}: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class com.example.testcovid.CalendarCustomView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class com.example.testcovid.CalendarCustomView
     Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class com.example.testcovid.CalendarCustomView
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.example.testcovid.CustomCalendarActivity.onCreate(CustomCalendarActivity.java:18)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLong(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLong(SQLiteConnection.java:599)
        at android.database.sqlite.SQLiteSession.executeForLong(SQLiteSession.java:652)
        at android.database.sqlite.SQLiteStatement.simpleQueryForLong(SQLiteStatement.java:107)
        at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:842)
        at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:830)
        at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java:940)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:311)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
E/AndroidRuntime:     at com.example.testcovid.Database.getAllFutureEvents(Database.java:434)
        at com.example.testcovid.CalendarCustomView.setUpCalendarAdapter(CalendarCustomView.java:375)
        at com.example.testcovid.CalendarCustomView.<init>(CalendarCustomView.java:82)
        	... 26 more

Est-ce que quelqu'un aurait une idée de ce qui pourrait clocher ?