1

I'm trying to upgrade my database from version 1 to version 2. I'm assigning DATABASE_VERSION = 2 (first version was assigned too) but onUpgrade never called. May be there is an obvious mistake in the code, but I can't see it beacause I'm trying to solve this problem for a long time.

Here is the code of database helper class:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    public static String DB_PATH;
    public static String DB_NAME = "db.sqlite3";
    public SQLiteDatabase database;
    public final Context context;

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        this.context = context;

        File direct = new File(Environment.getExternalStorageDirectory()
                + "/.test");
        if (!direct.exists()) {
            if (direct.mkdir())
                ;
        }
        DB_PATH = Environment.getExternalStorageDirectory().getPath()
                + "/.test/";
    }

    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        }
    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }
        if (checkDb != null) {
            checkDb.close();
        }
        return checkDb != null;
    }

    private void copyDataBase() throws IOException {
        InputStream externalDbStream = context.getAssets().open(
                "databases/" + DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream localDbStream = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }
        localDbStream.close();
        externalDbStream.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        }
        return database;
    }

    // some unimportant methods

@Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w("myLogs", " --- onUpgrade database --- ");
    }

In Activity I call database like this:

DatabaseHelper dbOpenHelper = new DatabaseHelper(this);
SQLiteDatabase database = dbOpenHelper.openDataBase();

Where is my mistake? Help, please.

UPD: database.getVersion() returns 0


Updated openDataBase() method (it's working):

public SQLiteDatabase openDataBase() throws SQLException {
    String path = DB_PATH + DB_NAME;
    if (database == null) {
        createDataBase();
        database = SQLiteDatabase.openDatabase(path, null,
            SQLiteDatabase.OPEN_READWRITE);
        this.getWritableDatabase();
    }
    return database;
}
Sabre
  • 4,131
  • 5
  • 36
  • 57

1 Answers1

3

Local database version will always be 0 and onUpgrade will not be called, because you never called getWritableDatabase/getReadableDatabase, which will bump version and return local db.

So you need:

  1. make call getReadableDatabase(); in your contructor/oncreate, just to trigger process, in case db version is changed
    or
  2. manually check sdcard version, db.getVersion(); compare to current version - DATABASE_VERSION. And do what ever you need to do - upgrade or downgrade.
vovkab
  • 1,292
  • 11
  • 17
  • 1) I tried to call `getWritableDatabase/getReadableDatabase` in constructor and in `openDataBase()` but I always get 0. 2) When I check version I get 0, so if I call `onUpgrade` manually (it's designed to be called automatically) it will be called everytime when database is opened. – Sabre Jan 15 '13 at 07:24
  • Which database version you check? the one that is on sdcard: openDataBase().getVersion(); or local getWritableDatabase().getVersion()? Can you please check both? – vovkab Jan 15 '13 at 07:26
  • You're right: `getWritableDatabase().getVersion()` returns 1, `openDataBase().getVersion()` returns 0. – Sabre Jan 15 '13 at 07:30
  • Btw, why you need onUpgrade? Just to copy a new DB from assets or something else? – vovkab Jan 15 '13 at 07:34
  • Also, your answer is the best. I needed only to call `getWritableDatabase` in `openDataBase()` – Sabre Jan 15 '13 at 07:36