|
28 | 28 | package com.onesignal;
|
29 | 29 |
|
30 | 30 | import android.content.Context;
|
| 31 | +import android.database.Cursor; |
31 | 32 | import android.database.sqlite.SQLiteDatabase;
|
| 33 | +import android.database.sqlite.SQLiteException; |
32 | 34 | import android.database.sqlite.SQLiteOpenHelper;
|
33 | 35 | import android.os.SystemClock;
|
34 | 36 |
|
35 | 37 | import com.onesignal.OneSignalDbContract.NotificationTable;
|
36 | 38 |
|
| 39 | +import java.util.ArrayList; |
| 40 | +import java.util.List; |
| 41 | + |
37 | 42 | public class OneSignalDbHelper extends SQLiteOpenHelper {
|
38 | 43 | private static final int DATABASE_VERSION = 2;
|
39 | 44 | private static final String DATABASE_NAME = "OneSignal.db";
|
@@ -116,14 +121,47 @@ public void onCreate(SQLiteDatabase db) {
|
116 | 121 |
|
117 | 122 | @Override
|
118 | 123 | 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) { |
119 | 134 | // Upgrading from v1
|
120 | 135 | if (oldVersion < 2) {
|
121 | 136 | 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 + ";"); |
123 | 138 | db.execSQL(NotificationTable.INDEX_CREATE_GROUP_ID);
|
124 | 139 | }
|
125 | 140 | }
|
126 | 141 |
|
| 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 | + |
127 | 165 | // Could enable WAL in the future but requires Android API 11
|
128 | 166 | /*
|
129 | 167 | @Override
|
|
0 commit comments