Verify database version before importing

pull/276/head
Alinson S. Xavier 9 years ago
parent 0d6ad26505
commit 140ab34a76

@ -21,10 +21,10 @@ package org.isoron.uhabits;
import android.app.*; import android.app.*;
import android.content.*; import android.content.*;
import android.support.annotation.*;
import com.activeandroid.*; import com.activeandroid.*;
import org.isoron.uhabits.models.sqlite.*;
import org.isoron.uhabits.notifications.*; import org.isoron.uhabits.notifications.*;
import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.preferences.*;
import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.tasks.*;
@ -88,7 +88,16 @@ public class HabitsApplication extends Application
if (db.exists()) db.delete(); if (db.exists()) db.delete();
} }
try
{
DatabaseUtils.initializeActiveAndroid(context); DatabaseUtils.initializeActiveAndroid(context);
}
catch (InvalidDatabaseVersionException e)
{
File db = DatabaseUtils.getDatabaseFile(context);
db.renameTo(new File(db.getAbsolutePath() + ".invalid"));
DatabaseUtils.initializeActiveAndroid(context);
}
widgetUpdater = component.getWidgetUpdater(); widgetUpdater = component.getWidgetUpdater();
widgetUpdater.startListening(); widgetUpdater.startListening();

@ -19,20 +19,20 @@
package org.isoron.uhabits.io; package org.isoron.uhabits.io;
import android.content.Context; import android.content.*;
import android.database.Cursor; import android.database.*;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.*;
import android.support.annotation.NonNull; import android.support.annotation.*;
import android.util.*;
import com.activeandroid.ActiveAndroid; import com.activeandroid.*;
import org.isoron.uhabits.AppContext; import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DatabaseUtils; import org.isoron.uhabits.utils.DatabaseUtils;
import org.isoron.uhabits.utils.FileUtils; import org.isoron.uhabits.utils.*;
import java.io.File; import java.io.*;
import java.io.IOException;
import javax.inject.*; import javax.inject.*;
@ -45,7 +45,8 @@ public class LoopDBImporter extends AbstractImporter
private Context context; private Context context;
@Inject @Inject
public LoopDBImporter(@NonNull @AppContext Context context, @NonNull HabitList habits) public LoopDBImporter(@NonNull @AppContext Context context,
@NonNull HabitList habits)
{ {
super(habits); super(habits);
this.context = context; this.context = context;
@ -59,15 +60,29 @@ public class LoopDBImporter extends AbstractImporter
SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getPath(), null, SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getPath(), null,
SQLiteDatabase.OPEN_READONLY); SQLiteDatabase.OPEN_READONLY);
boolean canHandle = true;
Cursor c = db.rawQuery( Cursor c = db.rawQuery(
"select count(*) from SQLITE_MASTER where name=? or name=?", "select count(*) from SQLITE_MASTER where name=? or name=?",
new String[]{ "Checkmarks", "Repetitions" }); new String[]{ "Checkmarks", "Repetitions" });
boolean result = (c.moveToFirst() && c.getInt(0) == 2); if (!c.moveToFirst() || c.getInt(0) != 2)
{
Log.w("LoopDBImporter", "Cannot handle file: tables not found");
canHandle = false;
}
if (db.getVersion() > BuildConfig.databaseVersion)
{
Log.w("LoopDBImporter", String.format(
"Cannot handle file: incompatible version: %d > %d",
db.getVersion(), BuildConfig.databaseVersion));
canHandle = false;
}
c.close(); c.close();
db.close(); db.close();
return result; return canHandle;
} }
@Override @Override

@ -0,0 +1,24 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.models.sqlite;
public class InvalidDatabaseVersionException extends RuntimeException
{
}

@ -25,6 +25,7 @@ import android.support.annotation.*;
import com.activeandroid.*; import com.activeandroid.*;
import org.isoron.uhabits.*; import org.isoron.uhabits.*;
import org.isoron.uhabits.models.sqlite.*;
import org.isoron.uhabits.models.sqlite.records.*; import org.isoron.uhabits.models.sqlite.records.*;
import java.io.*; import java.io.*;
@ -76,8 +77,17 @@ public abstract class DatabaseUtils
RepetitionRecord.class, ScoreRecord.class, StreakRecord.class) RepetitionRecord.class, ScoreRecord.class, StreakRecord.class)
.create(); .create();
try
{
ActiveAndroid.initialize(dbConfig); ActiveAndroid.initialize(dbConfig);
} }
catch (RuntimeException e)
{
if(e.getMessage().contains("downgrade"))
throw new InvalidDatabaseVersionException();
else throw e;
}
}
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")
public static String saveDatabaseCopy(Context context, File dir) throws IOException public static String saveDatabaseCopy(Context context, File dir) throws IOException

Loading…
Cancel
Save