title: SQLite add column, keep data
body: <p>I have a database with 4 columns:</p>
  
  <pre><code>@Override
  public void onCreate(SQLiteDatabase database) {
          database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT);");
  }
  </code></pre>
  
  <p>Now I want to add another column, but keep the rows that are already in the database. How should I do this? I can't find any useful references to this.</p>
  
  <pre><code>@Override
  public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
      //What to do here?
  }
  </code></pre>
  
  <p><strong>EDIT</strong></p>
  
  <p>I have modified my onCreate to:</p>
  
  <pre><code>@Override
  public void onCreate(SQLiteDatabase database) {
      database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT);");
  }
  </code></pre>
  
  <p>and my onUpgrade to:</p>
  
  <pre><code>@Override
  public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
      Logger.log("Updating userstations database from " + arg1 + " to " + arg2 + ".");
      if (arg1 == 2 &amp;&amp; arg2 == 3) {
          db.execSQL("ALTER TABLE " + DATABASENAME + " ADD COLUMN code TEXT;");
      } else if(arg1 == 1){
          db.execSQL("DROP TABLE IF EXISTS " + DATABASENAME);
      }
      onCreate(db);
  }
  </code></pre>
  
  <p>However, now I get this stacktrace:</p>
  
  <pre><code>10-01 21:24:19.581: ERROR/Database(21434): Failure 1 (table userstations already exists) on 0x19c378 when preparing 'CREATE TABLE userstations (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT);'.
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434): Couldn't open userstations for writing (will try read-only):
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434): android.database.sqlite.SQLiteException: table userstations already exists: CREATE TABLE userstations (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT);
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.databases.UserStationsOpenHelper.onCreate(UserStationsOpenHelper.java:25)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.databases.UserStationsOpenHelper.onUpgrade(UserStationsOpenHelper.java:36)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.databases.UserStationsOpenHelper.getStations(UserStationsOpenHelper.java:43)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.Data.readUserStations(Data.java:369)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.Data.getUserStations(Data.java:210)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.stationstab.StationsActivity.newStations(StationsActivity.java:190)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.stationstab.StationsActivity.refresh(StationsActivity.java:129)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.stationstab.StationsActivity.onCreate(StationsActivity.java:108)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.stationstab.StationsActivityGroup.onCreate(StationsActivityGroup.java:38)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.widget.TabHost.setCurrentTab(TabHost.java:326)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.widget.TabHost.addTab(TabHost.java:216)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.TreinVerkeer.setupTab(TreinVerkeer.java:131)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.TreinVerkeer.initTabs(TreinVerkeer.java:108)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.myapp.myapp.TreinVerkeer.onCreate(TreinVerkeer.java:62)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.os.Handler.dispatchMessage(Handler.java:99)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.os.Looper.loop(Looper.java:123)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at android.app.ActivityThread.main(ActivityThread.java:3835)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at java.lang.reflect.Method.invokeNative(Native Method)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at java.lang.reflect.Method.invoke(Method.java:507)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
  10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):     at dalvik.system.NativeStart.main(Native Method)
  10-01 21:24:19.621: DEBUG/AndroidRuntime(21434): Shutting down VM
  10-01 21:24:19.621: WARN/dalvikvm(21434): threadid=1: thread exiting with uncaught exception (group=0x4018a560)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434): FATAL EXCEPTION: main
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.TreinVerkeer}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivityGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.os.Handler.dispatchMessage(Handler.java:99)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.os.Looper.loop(Looper.java:123)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.main(ActivityThread.java:3835)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at java.lang.reflect.Method.invokeNative(Native Method)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at java.lang.reflect.Method.invoke(Method.java:507)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at dalvik.system.NativeStart.main(Native Method)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivityGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.widget.TabHost.setCurrentTab(TabHost.java:326)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.widget.TabHost.addTab(TabHost.java:216)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp.TreinVerkeer.setupTab(TreinVerkeer.java:131)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp.TreinVerkeer.initTabs(TreinVerkeer.java:108)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp.TreinVerkeer.onCreate(TreinVerkeer.java:62)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     ... 11 more
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp.stationstab.StationsActivityGroup.onCreate(StationsActivityGroup.java:38)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     ... 22 more
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:199)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp.databases.UserStationsOpenHelper.getStations(UserStationsOpenHelper.java:43)
  10-01 21:24:19.641: ERROR/AndroidRuntime(21434):     at com.myapp.myapp
  </code></pre>