Dropping SQLite database on upgrading application - android

I implemented an Android application which use Sqlite database.
When I release a new version of my application (not in playStore), I upload it on my server, so, if the old application is running, calling web service, can understand that new version is available. So, new version is downloaded and installed.
When the application is overinstalled, the database is not dropped, so if I need to do any changes of my database I need to use the method:
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion)
This is fine, unless I need to do many changes in my database. In this case, the code becomes unreadable. So I would to delete the database and create a new one.
How can I perform this task?
EDIT: What about using context.deleteDatabase(DATABASE_NAME); ?

For throw-away databases (where the data is e.g. a cached copy of data available in the cloud) I usually make onUpgrade() just call onCreate() and make onCreate() execute DROP TABLE IF EXISTS <tablename> before creating the tables.
For example:
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS foo");
db.execSQL("CREATE TABLE foo(bar INTEGER, baz TEXT");
}

you can think about this one
keep a trace of your upgrade using a flag in shared preference. when you are downloading new version then set the flag to true. on every launch check the flag. if the flag is true then recreate the database and set the flag false.
I havn't tried similar things but I think it should work in your case.
and to delete database context.deleteDatabase(DATABASE_NAME);

If you just want to re-create your whole database, just drop every table in the old one.

Related

SQLite database, onUpgrade for version1 to release

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.

Delete database when on app update

I have preloaded sqlite database located in assets, which is copied to default database location after app first installation. I'd like to do this procedure on each app update.
I don't need to keep any user data from existing database.
How to delete old database file, when app is being updated?
These are actually two questions:
How do I do something on app update
You could save a variable with the last version code in a Shared Preferences. After each start of the application you check your current code with the saved code. If they don't match, it was an update and you execute some code.
How do I delete a database
If the database is closed, you can simply delete the file. Use Context.getDatabasePath(String) to find the location of the file, and File.delete() for deleting it. Make sure no process is accessing the database file. If so, you might need to use the File.deleteOnExit() and force a restart of the application.
Use onUpgrade() method of SQLiteOpenHelper class.
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Delete old table
db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
// Re-create table
onCreate(db);
}

Android DBHelper Upgrade

I have a mozilla sqlite for my android App.
in the sqlite manager on my firefox, i'm add a row to my table.and when i run program, the database not updated.
so i change my oncreate and upgrade method as bellow:
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE Db_City");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST Db_City");
onCreate(db);
}
and change the version of my database.
but when i run the program again all of my data in app is missing.
can anybody help me to exactly what to do?
tanks.
Dropping the table deletes all the data in the table.
You need to copy the data somewhere (probably best to rename it).
delete database (probably best to rename it).
create a new database.
re-load (and probably convert) the data.

Will my app update sucessfully in market if i add new columns to sqlite?

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);
}

Upgrade database. Can I alter tables or need to create new?

I'm using a database in my application which is currently on the Google Play. Now I'm releasing an update and have added a new column to an existing table. Looks like I need to use onUpgrade() method of SQLiteOpenHelper class. I'm just wondering if I need to recreate the whole table, which leads to backup/restore (which is complex) process, or I can just alter it on upgrade? How shall I handle upgrade in the code? Is it just enough to implement onUpgrade() method? Might be any good example? Really appreciate your input, thank you very much.
Yes, you can alter table . No need to create it again .
private static final String ALTER_USER_TABLE_ADD_USER_SOCIETY = "ALTER TABLE user_table ADD user_society TEXT";
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
if(newVersion > oldVersion)
{
db.execSQL(ALTER_USER_TABLE_ADD_USER_SOCIETY);
}
}

Categories

Resources