I have a local SQLite database on an Android app and I'm a bit confused on how to manage it when the app gets updated. I need to keep the data stored in the DB whenever I update the app but also I think i'm going to add columns and probably also tables. What's the best practice to do so?
My idea was to check the DB version and if it matches the old version call a method to add the new columns/tables and then upgrade the version, is it the correct approach or there's something else to consider?
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
db.execSQL(DATABASE_ALTER_TEAM_1);
}
if (oldVersion < 3) {
db.execSQL(DATABASE_ALTER_TEAM_2);
}
if (oldVersion < 4) {
db.execSQL(DATABASE_ALTER_TEAM_3);
}
}
This is the best way of handling the onUpgrade(). Because users may not update all versions, In that cases this is the best approach.
Related
OK, so my app is ready for full release. I want to prepare my SQLite db correctly for release. My initial development program utilized the following code for onUpgrade (SQLite db helper class).
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
Then, as I needed to update my database, I followed this tutorial to increase the revision numbers, add columns, and all worked very well. For example, my onUpgrade changed to this.
private static final String DATABASE_ALTER_ADD_VELOCITY = "ALTER TABLE walk_run_table ADD COLUMN VELOCITY_CALC REAL";
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) db.execSQL(DATABASE_ALTER_ADD_VELOCITY);
if (oldVersion < 3) db.execSQL(DATABASE_ALTER_ADD_ELEVATION);
}
Now, I'm preparing for release and want to bring my version back down to 1 (since all users will be getting a fresh install of course). Should my onUpgrade revert to "DROP TABLE IF EXISTS".... ? And then proceed with revisions as shown in the tutorial mentioned earlier? This worked well for me in development and I suspect will work well for release, but want to make sure for uploading my program to google play. Is there a better practice to prepare the SQLite db for future revisions?
It does not matter which actual version number you are using; it can go up to four billion.
And future app versions will have to increase the database version anyway; there's nothing gained by setting it to one now.
Your released app will never encounter an old database, so you can remove the code to update from older development versions.
If you do encounter a smaller version number, you have accidentally run it on a development machine, or the database file got corrupted, or someone copied a fake database into your application's storage. In all cases, the correct response is to error out.
I want to add a few columns to my sqlite and maybe new tables to my app, but its already in the market and i know that if i change the something on database structure then the app needs uninstall and reinstall.
Will this happen to a live app and the user will have to uninstall first or will it update sucessfully?
Thank you
EDIT:
What i had in on upgrade is this:
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
but i quess it never worked. If i replace it with
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "ALTER TABLE tablename ADD COLUMN newcolumn INT";
if (oldVersion == 1 && newVersion == 2)
db.execSQL(query );
}
will it be ok?
Using a SQLiteOpenHelper this problem is resolved. Using this class you will have a db_version. Everytime you increase your db_version, you have a method called onUpgrade that will be called.
Check this out.
One thing you have to take into consideration is the db_version of your previous app version. You will need to apply all the changes between your old db_version to your last db_version.
Hope it helps
If I change something on database structure then the app needs
uninstall and reinstall?
Why would that be? The SQLiteOpenHelper class provides a good mechanism for handling changes into the structure of an app's database. Namely, onUpgrade(). You can perform whatever changes are necessary (creating new tables, dropping old ones, altering, &c in there).
From the documentation of the constructor:
version: number of the database (starting at 1); if the database is older, onUpgrade(SQLiteDatabase, int, int) will be used to upgrade the database; if the database is newer, onDowngrade(SQLiteDatabase, int, int) will be used to downgrade the database
No. If a user is updating an application (not uninstalling it - in that case it will be deleted) and a database already exists then Android will not just delete it (it could contain important information!).
Instead the onUpgrade method of your SQLiteOpenHelper will be called, and it is up to you to decide if you want to clear the data or preserve it.
You have to handle manipulation inside the onUpgrade method.
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "ALTER TABLE tablename ADD COLUMN newcolumn INT";
if (oldVersion == 1 && newVersion == 2)
db.execSQL(query);
}
Android Developers have to use SQL lite for Android application, that is easy, but the problem comes when we have to upgrade the database version, we have to remove old database and create new database on upgrade, so if we want to add just one column, we have to remove all user data, is there any component or source code that manage the database upgrade, so if it only need one column, just add one column, not delete all tables.
This is completely wrong
when we have to upgrade the database version, we have to remove old database and create new database on upgrade
In your onUpgrade method, it would look something like this:
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String upgradeQuery = "ALTER TABLE yourtable ADD COLUMN yourcolumn TEXT";
if (oldVersion == 1 && newVersion == 2)
db.execSQL(upgradeQuery);
}
Im using ORMLite as the data persistence option in my android application. I want to ensure data backup and recovery on re-install. If i make some changes in the app logic and re-install the application the data is unchanged, but how can i handle the schema change, i the new version of app has some database schema changes how can i handle the import of user data into newer schema. Please guide me towards possible solutions i can avail.
Regards.
but how can i handle the schema change, i the new version of app has some database schema changes how can i handle the import of user data into newer schema
If I'm understanding the question, it's not about import but it is about schema updating when you install a new version of the OS. ORMLite actually has a section about that:
http://ormlite.com/docs/upgrade-schema
To quote, you need to override the onUpgrade(...) method and do something like:
abstract void onUpgrade(SQLiteDatabase database,
ConnectionSource connectionSource, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// we added the age column in version 2
dao.executeRaw("ALTER TABLE `account` ADD COLUMN age INTEGER;");
}
if (oldVersion < 3) {
// we added the weight column in version 3
dao.executeRaw("ALTER TABLE `account` ADD COLUMN weight INTEGER;");
}
}
If I'm not getting your question then please edit your post and I'll add more information.
During an upgrade, I want to add a new table to my database, but also not lose the data from the other tables when upgrading the application. Can someone tell me, (but if you could show me some example also) of how this is done. Because I've looked through the forums but mainly there are discussions about adding a new column etc. I figured that I have to do it somehow with alter table, but I did not understand everything. If you can tell me the steps of this process I would really appreciate it. Thank u in advance.
If you just want to add a new table and not modify any of your existing tables, then you could just create the new table in your onUpgrade method. This way your existing tables will be untouched.
EDIT: Even better, add the table as usual in onCreate and then in onUpgrade you call onCreate
Try using SQLiteOpenHelper in Android. It has methods for onCreate and onUpgrade.
Sample:
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
Maas360Logger.i(loggerName, "upgrading database "+oldVersion+" "+newVersion);
try {
database.beginTransaction();
for (int i = oldVersion + 1; i <= newVersion; i++) {
// Future schema changes has to go into this loop
Maintain database versions to handle upgrades