SQL updating system for applications

Quickly share your Android Code Snippets here...

SQL updating system for applications

Postby nbadal » Tue Dec 29, 2009 9:00 pm

For my app, SchoolDroid, I had to make a system to make changes to a SQL db without disturbing the contents (i.e. not having to wipe after an update), so I created this little backend to run and check for updates and SQL changes.

It uses the SQL interface from the notepad tutorial, stripped down to what it needs.

The SQL controller (master)
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public class SqlMaster {
  2.  
  3.     public static final String KEY_VERSION = "version";
  4.  
  5.     public static final String KEY_QUERY = "query";
  6.  
  7.    
  8.  
  9.         public static final String DATABASE_NAME = "data";
  10.  
  11.         public static final String TABLE_SQL_UPDATES = "sql_updates";
  12.  
  13.        
  14.  
  15.         private static final String TAG = "SqlMaster";
  16.  
  17.         private static final int DATABASE_VERSION = 2;
  18.  
  19.        
  20.  
  21.         private DatabaseHelper mDbHelper;
  22.  
  23.     private SQLiteDatabase mDb;
  24.  
  25.        
  26.  
  27.         private final Context mCtx;
  28.  
  29.        
  30.  
  31.         private static class DatabaseHelper extends SQLiteOpenHelper {
  32.  
  33.  
  34.  
  35.         DatabaseHelper(Context context) {
  36.  
  37.             super(context, DATABASE_NAME, null, DATABASE_VERSION);
  38.  
  39.         }
  40.  
  41.  
  42.  
  43.         @Override
  44.  
  45.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  46.  
  47.             Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
  48.  
  49.                     + newVersion + ", which will destroy all old data");
  50.  
  51.             db.execSQL("DROP TABLE IF EXISTS sql_updates");
  52.  
  53.             onCreate(db);
  54.  
  55.         }
  56.  
  57.  
  58.  
  59.                 @Override
  60.  
  61.                 public void onCreate(SQLiteDatabase db) {
  62.  
  63.                        
  64.  
  65.                 }
  66.  
  67.     }
  68.  
  69.        
  70.  
  71.         public SqlMaster(Context ctx) {
  72.  
  73.                 this.mCtx = ctx;
  74.  
  75.     }
  76.  
  77.        
  78.  
  79.         public SqlMaster open() throws SQLException {
  80.  
  81.         mDbHelper = new DatabaseHelper(mCtx);
  82.  
  83.         mDb = mDbHelper.getWritableDatabase();
  84.  
  85.         return this;
  86.  
  87.     }
  88.  
  89.        
  90.  
  91.         public void close() {
  92.  
  93.         mDbHelper.close();
  94.  
  95.     }
  96.  
  97.        
  98.  
  99.         public int getOldVersion() {
  100.  
  101.                 String tableQuery = "select " + KEY_VERSION + " from " + TABLE_SQL_UPDATES;
  102.  
  103.                 Cursor tableCursor = mDb.rawQuery(tableQuery, null);
  104.  
  105.                 if(tableCursor.getCount() == 0) {
  106.  
  107.                         return 0;
  108.  
  109.                 } else {
  110.  
  111.                         tableCursor.moveToLast();
  112.  
  113.                         return tableCursor.getInt(tableCursor.getColumnIndexOrThrow(KEY_VERSION));
  114.  
  115.                 }
  116.  
  117.         }
  118.  
  119.        
  120.  
  121.         public long addNewVersion(Version u) {
  122.  
  123.                 ContentValues initialValues = u.getValues();
  124.  
  125.                 return mDb.insert(TABLE_SQL_UPDATES, null, initialValues);
  126.  
  127.         }
  128.  
  129.        
  130.  
  131.         public boolean updateToVersion(int newVersion, int oldVersion) {
  132.  
  133.                 String query = "select * from " + TABLE_SQL_UPDATES + " where " + KEY_VERSION + " > " + oldVersion;
  134.  
  135.                 Cursor updates = mDb.rawQuery(query, null);
  136.  
  137.                 if(updates.getCount() <= 0) {
  138.  
  139.                         return false;
  140.  
  141.                 }
  142.  
  143.                 updates.moveToFirst();
  144.  
  145.                 int workVer = updates.getInt(updates.getColumnIndexOrThrow(KEY_VERSION));
  146.  
  147.                 while(workVer <= newVersion) {
  148.  
  149.                         String q = updates.getString(updates.getColumnIndexOrThrow(KEY_QUERY));
  150.  
  151.                         mDb.execSQL(q);
  152.  
  153.                         if(workVer < newVersion) {
  154.  
  155.                                 updates.moveToNext();
  156.  
  157.                         }
  158.  
  159.                         if(workVer == newVersion){
  160.  
  161.                                 break;
  162.  
  163.                         }
  164.  
  165.                 }
  166.  
  167.                 return true;
  168.  
  169.         }
  170.  
  171.  
  172.  
  173.         public void clearTable(String table) {
  174.  
  175.                 mDb.execSQL("DELETE FROM " + table);
  176.  
  177.         }
  178.  
  179. }
Parsed in 0.042 seconds, using GeSHi 1.0.8.4



The Update Controller
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. class UpdateSystem {
  2.  
  3.         static int numberOfUpdates = 5;
  4.  
  5.         static Version updates[] = {
  6.  
  7.                         new Version(110,"CREATE TABLE tester (row1 int, row2 int)"),
  8.  
  9.                         new Version(111,"ALTER TABLE tester ADD row3 char(4) default 'abcd'"),
  10.  
  11.                         new Version(111,"ALTER TABLE tester ADD newcolumn int"),
  12.  
  13.                         new Version(200,"CREATE TABLE diditwork (row1 int, row2 char(3))"),
  14.  
  15.                         new Version(202,"ALTER TABLE diditwork ADD newrow int")
  16.  
  17.         };
  18.  
  19.        
  20.  
  21.         static void updateSql(Context ctx) {
  22.  
  23.                 SqlMaster mDbHelper = new SqlMaster(ctx);
  24.  
  25.             mDbHelper.open();
  26.  
  27.           //get last known version + newest version
  28.  
  29.             int currVer = 0;
  30.  
  31.                 int oldVer = 0;        
  32.  
  33.                 try {
  34.  
  35.                         currVer = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0).versionCode;
  36.  
  37.                 } catch (NameNotFoundException e) {
  38.  
  39.                         e.printStackTrace();
  40.  
  41.                 }
  42.  
  43.                 oldVer = mDbHelper.getOldVersion();
  44.  
  45.             //Replace sql queries
  46.  
  47.             mDbHelper.clearTable(SqlMaster.TABLE_SQL_UPDATES);
  48.  
  49.             for(int i = 0;numberOfUpdates>i;i++) {
  50.  
  51.                         mDbHelper.addNewVersion(updates[i]);
  52.  
  53.                 }
  54.  
  55.                 //start running SQL commands from last recorded version # + 1          
  56.  
  57.                 //if we dont have an old update line, run newest one
  58.  
  59.                 if(oldVer == 0) {
  60.  
  61.                         oldVer = currVer - 1;
  62.  
  63.                 }
  64.  
  65.                
  66.  
  67.                 if(currVer > oldVer) {
  68.  
  69.                         mDbHelper.updateToVersion(currVer, oldVer);
  70.  
  71.                 }
  72.  
  73.                
  74.  
  75.                 mDbHelper.close();
  76.  
  77.         }
  78.  
  79. }
Parsed in 0.035 seconds, using GeSHi 1.0.8.4


A version class to hold update info
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public class Version {
  2.  
  3.         public int mVersion;
  4.  
  5.         public String mQuery;
  6.  
  7.        
  8.  
  9.         Version(int version, String query) {
  10.  
  11.                 mVersion = version;
  12.  
  13.                 mQuery = query;
  14.  
  15.         }
  16.  
  17.        
  18.  
  19.         public ContentValues getValues() {
  20.  
  21.                 ContentValues c = new ContentValues();
  22.  
  23.                 c.put(SqlMaster.KEY_VERSION, mVersion);
  24.  
  25.                 c.put(SqlMaster.KEY_QUERY, mQuery);
  26.  
  27.                 return c;
  28.  
  29.         }
  30.  
  31. }
Parsed in 0.034 seconds, using GeSHi 1.0.8.4


Add items to the updates array in UpdateSystem with the version # and SQL command, change the numberofupdates to the number of updates, and use the command UpdateSystem.updateSql(this); when your application starts to use it :)
nbadal
Developer
Developer
 
Posts: 30
Joined: Tue May 26, 2009 3:55 pm

Top

Return to Code Snippets for Android

Who is online

Users browsing this forum: No registered users and 3 guests