Mam aplikację z bazą danych, utworzoną i otwartą przy użyciu standardowego SQLiteOpenHelper.Nie mogę obniżyć wersji bazy danych z wersji `n` na` n-1` na Samsunga
Ilekroć aktualizuję wersję bazy danych, aktualizuję również kod wersji aplikacji, więc nie ma możliwości, aby baza danych uległa zmniejszeniu (numer wersji bazy danych jest zawsze zwiększany, nigdy nie zmniejszany).
Wyłączyłem kopię zapasową bazy danych w mojej aplikacji, ustawiając właściwość android:allowBackup
na wartość false.
Ale kiedy uaktualnić aplikację w Sklepie Play, dostaję dużo katastrofie
Nie można obniżyć bazę danych z wersji
n
don-1
96% osób w katastrofie występują na Działające urządzenie Samsung. Ktoś wie, dlaczego występuje ten problem, a co ważniejsze, jak temu zapobiec?
Wiem, że mogę przesłonić onDowngrade, aby zapobiec awarii, ale tak naprawdę nie rozumiem, dlaczego onDowngrade jest wywoływana w ogóle, ponieważ awarię wywołuje się w aplikacji, która zawsze używa ostatniej wersji bazy danych.
Edit: Dodano przykładowy kod, FWIW
Moja OpenHelper:
public class MyDBHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = MyDBHelper.class.getName();
public static final String DB_NAME = "my_db";
public static final int DB_V1 = 1;
public static final int DB_V2_UNIQUE_IDS = 2;
public static final int DB_V3_METADATAS = 3;
public static final int DB_V4_CORRUPTED_IDS = 4;
public static final int DB_V5_USAGE_TABLE = 5;
public static final int DB_VERSION = DB_V5_USAGE_TABLE;
public MyDBHelper(final Context context, IExceptionLogger logger) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onCreate()");
db.execSQL(createMyTable());
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);
if (oldVersion < 2) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 1 table to version 2");
db.execSQL(upgradeTable_v1_to_v2());
}
if (oldVersion < 3) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 2 Entry table to version 3");
db.execSQL(upgradeTable_v2_to_v3());
}
}
@Override
@TargetApi(Build.VERSION_CODES.FROYO)
public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onDowngrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);
super.onDowngrade(db, oldVersion, newVersion);
}
}
A jak ja go zainicjować:
public class DatabaseController {
private MyDBHelper mDBHelper;
public void initialize(final Context context) {
mDBHelper = new MyDBHelper(context);
}
}
Czy jesteś w stanie zobaczyć, czy te awarie pochodzą z urządzeń zrootowanych? na urządzeniach zrootowanych użytkownicy mogą zdegradować aplikacje, jeśli zdecydują się na – marmor
99,9% urządzenia nie jest zrootowanych. – XGouchet
czy może używasz 'SQLiteOpenHelper' z parametrem wersji gdzieś w projekcie? Jeśli nadpisujesz 'SQLiteOpenHelper', upewnij się, że wywołujesz super w konstruktorze z najnowszą wersją – marmor