Skip to content

Commit c4ffa7d

Browse files
committed
SQL onDowngrade added to handle future SDK downgrades
* This will fix future "Can't downgrade database from version X to X" errors. - This won't fix 2 to 1 errors but will prevent 3+ to 2 errors if the there is a v3 schema change. * Handling issue was brought up in issue #222
1 parent bc47200 commit c4ffa7d

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,17 @@
2828
package com.onesignal;
2929

3030
import android.content.Context;
31+
import android.database.Cursor;
3132
import android.database.sqlite.SQLiteDatabase;
33+
import android.database.sqlite.SQLiteException;
3234
import android.database.sqlite.SQLiteOpenHelper;
3335
import android.os.SystemClock;
3436

3537
import com.onesignal.OneSignalDbContract.NotificationTable;
3638

39+
import java.util.ArrayList;
40+
import java.util.List;
41+
3742
public class OneSignalDbHelper extends SQLiteOpenHelper {
3843
private static final int DATABASE_VERSION = 2;
3944
private static final String DATABASE_NAME = "OneSignal.db";
@@ -116,14 +121,47 @@ public void onCreate(SQLiteDatabase db) {
116121

117122
@Override
118123
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
124+
try {
125+
internalOnUpgrade(db, oldVersion, newVersion);
126+
} catch (SQLiteException e) {
127+
// This could throw if rolling back then forward again.
128+
// However this shouldn't happen as we clearing the database on onDowngrade
129+
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, "Error in upgrade, migration may have already run! Skipping!" , e);
130+
}
131+
}
132+
133+
private static void internalOnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
119134
// Upgrading from v1
120135
if (oldVersion < 2) {
121136
db.execSQL("ALTER TABLE " + NotificationTable.TABLE_NAME + " " +
122-
"ADD COLUMN " + NotificationTable.COLUMN_NAME_COLLAPSE_ID + TEXT_TYPE + ";");
137+
"ADD COLUMN " + NotificationTable.COLUMN_NAME_COLLAPSE_ID + TEXT_TYPE + ";");
123138
db.execSQL(NotificationTable.INDEX_CREATE_GROUP_ID);
124139
}
125140
}
126141

142+
@Override
143+
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
144+
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "SDK version rolled back! Clearing " + DATABASE_NAME + " as it could be in an unexpected state.");
145+
146+
Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
147+
try {
148+
List<String> tables = new ArrayList<>(cursor.getCount());
149+
150+
while (cursor.moveToNext())
151+
tables.add(cursor.getString(0));
152+
153+
for (String table : tables) {
154+
if (table.startsWith("sqlite_"))
155+
continue;
156+
db.execSQL("DROP TABLE IF EXISTS " + table);
157+
}
158+
} finally {
159+
cursor.close();
160+
}
161+
162+
onCreate(db);
163+
}
164+
127165
// Could enable WAL in the future but requires Android API 11
128166
/*
129167
@Override

0 commit comments

Comments
 (0)