Skip to content

Commit f6b9ca6

Browse files
authored
Fix SQLiteDatabaseLockedException (#1109)
* Synchronize database due to differents threads trying to modify database * Remove database access from other classes that are not OneSignalDBHelper * Create query, insert, update, delete methods on OneSignalDBHelper * Make OneSignalDBHelper the only responsible of altering db
1 parent d35ca90 commit f6b9ca6

26 files changed

+603
-731
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/BadgeCountUpdater.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,19 @@
2727

2828
package com.onesignal;
2929

30-
import android.app.NotificationManager;
3130
import android.content.Context;
3231
import android.content.pm.ApplicationInfo;
3332
import android.content.pm.PackageManager;
3433
import android.database.Cursor;
35-
import android.database.sqlite.SQLiteDatabase;
3634
import android.os.Build;
3735
import android.os.Bundle;
3836
import android.service.notification.StatusBarNotification;
3937
import android.support.annotation.RequiresApi;
4038

39+
import com.onesignal.OneSignalDbContract.NotificationTable;
4140
import com.onesignal.shortcutbadger.ShortcutBadgeException;
4241
import com.onesignal.shortcutbadger.ShortcutBadger;
4342

44-
import com.onesignal.OneSignalDbContract.NotificationTable;
45-
4643
import static com.onesignal.NotificationLimitManager.MAX_NUMBER_OF_NOTIFICATIONS_STR;
4744

4845
class BadgeCountUpdater {
@@ -75,14 +72,14 @@ private static boolean areBadgesEnabled(Context context) {
7572
return areBadgeSettingsEnabled(context) && OSUtils.areNotificationsEnabled(context);
7673
}
7774

78-
static void update(SQLiteDatabase readableDb, Context context) {
75+
static void update(OneSignalDb db, Context context) {
7976
if (!areBadgesEnabled(context))
8077
return;
8178

8279
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
8380
updateStandard(context);
8481
else
85-
updateFallback(readableDb, context);
82+
updateFallback(db, context);
8683
}
8784

8885
@RequiresApi(api = Build.VERSION_CODES.M)
@@ -99,8 +96,8 @@ private static void updateStandard(Context context) {
9996
updateCount(runningCount, context);
10097
}
10198

102-
private static void updateFallback(SQLiteDatabase readableDb, Context context) {
103-
Cursor cursor = readableDb.query(
99+
private static void updateFallback(OneSignalDb db, Context context) {
100+
Cursor cursor = db.query(
104101
NotificationTable.TABLE_NAME,
105102
null,
106103
OneSignalDbHelper.recentUninteractedWithNotificationsWhere().toString(),

OneSignalSDK/onesignal/src/main/java/com/onesignal/GenerateNotification.java

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,6 @@
2727

2828
package com.onesignal;
2929

30-
import java.lang.reflect.Field;
31-
import java.math.BigInteger;
32-
import java.net.URL;
33-
import java.util.ArrayList;
34-
import java.util.Arrays;
35-
import java.util.Collection;
36-
import java.util.List;
37-
import java.security.SecureRandom;
38-
import java.util.Random;
39-
40-
import org.json.JSONArray;
41-
import org.json.JSONException;
42-
import org.json.JSONObject;
43-
4430
import android.R.drawable;
4531
import android.app.Activity;
4632
import android.app.AlertDialog;
@@ -53,7 +39,6 @@
5339
import android.content.pm.PackageManager;
5440
import android.content.res.Resources;
5541
import android.database.Cursor;
56-
import android.database.sqlite.SQLiteDatabase;
5742
import android.graphics.Bitmap;
5843
import android.graphics.BitmapFactory;
5944
import android.net.Uri;
@@ -68,6 +53,20 @@
6853

6954
import com.onesignal.OneSignalDbContract.NotificationTable;
7055

56+
import org.json.JSONArray;
57+
import org.json.JSONException;
58+
import org.json.JSONObject;
59+
60+
import java.lang.reflect.Field;
61+
import java.math.BigInteger;
62+
import java.net.URL;
63+
import java.security.SecureRandom;
64+
import java.util.ArrayList;
65+
import java.util.Arrays;
66+
import java.util.Collection;
67+
import java.util.List;
68+
import java.util.Random;
69+
7170
import static com.onesignal.OSUtils.getResourceString;
7271

7372
class GenerateNotification {
@@ -528,8 +527,6 @@ private static void createSummaryNotification(NotificationGenerationJob notifJob
528527
Cursor cursor = null;
529528

530529
try {
531-
SQLiteDatabase readableDb = dbHelper.getSQLiteDatabaseWithRetries();
532-
533530
String[] retColumn = { NotificationTable.COLUMN_NAME_ANDROID_NOTIFICATION_ID,
534531
NotificationTable.COLUMN_NAME_FULL_DATA,
535532
NotificationTable.COLUMN_NAME_IS_SUMMARY,
@@ -545,7 +542,7 @@ private static void createSummaryNotification(NotificationGenerationJob notifJob
545542
if (!updateSummary && notifJob.getAndroidId() != -1)
546543
whereStr += " AND " + NotificationTable.COLUMN_NAME_ANDROID_NOTIFICATION_ID + " <> " + notifJob.getAndroidId();
547544

548-
cursor = readableDb.query(
545+
cursor = dbHelper.query(
549546
NotificationTable.TABLE_NAME,
550547
retColumn,
551548
whereStr,
@@ -769,28 +766,11 @@ private static Intent createBaseSummaryIntent(int summaryNotificationId, JSONObj
769766
private static void createSummaryIdDatabaseEntry(OneSignalDbHelper dbHelper, String group, int id) {
770767
// There currently isn't a visible notification from for this groupid.
771768
// Save the group summary notification id so it can be updated later.
772-
SQLiteDatabase writableDb = null;
773-
try {
774-
writableDb = dbHelper.getSQLiteDatabaseWithRetries();
775-
writableDb.beginTransaction();
776-
777-
ContentValues values = new ContentValues();
778-
values.put(NotificationTable.COLUMN_NAME_ANDROID_NOTIFICATION_ID, id);
779-
values.put(NotificationTable.COLUMN_NAME_GROUP_ID, group);
780-
values.put(NotificationTable.COLUMN_NAME_IS_SUMMARY, 1);
781-
writableDb.insertOrThrow(NotificationTable.TABLE_NAME, null, values);
782-
writableDb.setTransactionSuccessful();
783-
} catch (Throwable t) {
784-
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, "Error adding summary notification record! ", t);
785-
} finally {
786-
if (writableDb != null) {
787-
try {
788-
writableDb.endTransaction(); // May throw if transaction was never opened or DB is full.
789-
} catch (Throwable t) {
790-
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, "Error closing transaction! ", t);
791-
}
792-
}
793-
}
769+
ContentValues values = new ContentValues();
770+
values.put(NotificationTable.COLUMN_NAME_ANDROID_NOTIFICATION_ID, id);
771+
values.put(NotificationTable.COLUMN_NAME_GROUP_ID, group);
772+
values.put(NotificationTable.COLUMN_NAME_IS_SUMMARY, 1);
773+
dbHelper.insertOrThrow(NotificationTable.TABLE_NAME, null, values);
794774
}
795775

796776
// Keep 'throws Throwable' as 'onesignal_bgimage_notif_layout' may not be available

0 commit comments

Comments
 (0)