Fazendo update de aplicativo sem destruir base de dados

Oi gente, tudo bem?
Tenho uma aplicação para android chamada Track Location que está publicada na samsungapps e estou com um problema, ele tem uma base de dados em sqlite com 4 campos: id, latitude, longitude, datetime, tipoLocalização

Porém gostaria de fazer um update no meu app para adicionar mais campos na base de dados, como precisão e altitude, porém se eu fizer um update e incluir esses campos, como estou usando um DBAdapter, o banco de dados da pessoa vai ser apagado(ou melhor, sobreescrito), para que seja adicionados os dois campos a base de dados, porém os registros que estão anteriormente salvos serão apagados.

É possível fazer um update no banco de dados, sem apagar os dados usando

Esse é meu DBAdapter

public class DBAdapter {
	public static final String KEY_ROWID = "_id";
	public static final String KEY_LAT = "lat";
	public static final String KEY_LON = "lon";
	public static final String KEY_DATEANDTIME = "dataehora";
	public static final String KEY_PROVIDER = "provider";
	private static final String TAG = "DBAdapter";

	private static final String DATABASE_NAME = "basededados";
	private static final String DATABASE_TABLE = "coordenadas";
	private static final int DATABASE_VERSION = 6;
	
	private static final String DATABASE_CREATE = "CREATE TABLE coordenadas (_id integer primary key autoincrement, "
					+ "lat text not null, lon text not null, "
					+ "dataehora datetime default current_timestamp, provider text not null);";
		
	private final Context context;

	private DatabaseHelper DBHelper;
	private SQLiteDatabase db;

	public DBAdapter(Context ctx) {
		this.context = ctx;
		DBHelper = new DatabaseHelper(context);
	}

	private static class DatabaseHelper extends SQLiteOpenHelper {
		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
					+ newVersion + ", which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS coordenadas");
			onCreate(db);
		}
	}

	// ---opens the database---
	public DBAdapter open() throws SQLException {
		db = DBHelper.getWritableDatabase();
		return this;
	}

	// ---closes the database---
	public void close() {
		DBHelper.close();
	}

	// ---insert a title into the database---
	public long insertTitle(String lan, String lon, String provider, String dateandtime) {
		Date hoje = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");        
		ContentValues initialValues = new ContentValues();		
		initialValues.put(KEY_LAT, lan);
		initialValues.put(KEY_LON, lon);		
		//initialValues.put(KEY_DATEANDTIME, hoje.toLocaleString());
		initialValues.put(KEY_DATEANDTIME, sdf.format(hoje));
		initialValues.put(KEY_PROVIDER, provider);		
		return db.insert(DATABASE_TABLE, null, initialValues);
	}

	// ---deletes a particular title---
	public boolean deleteTitle(long rowId) {
		return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
	}

	// ---deletes all titles---
	public void deleteAllTitle() {
		db.delete(DATABASE_TABLE, null, null);
	}
	
	// ---retrieves all the titles---
	public Cursor getAllTitles() {
		return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_LAT,
				KEY_LON, KEY_DATEANDTIME, KEY_PROVIDER }, null, null, null, null, null);
	}

	// ---retrieves a particular title---
		public Cursor getTitleByDay(String date) throws SQLException {
			Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
					KEY_ROWID, KEY_LAT, KEY_LON, KEY_DATEANDTIME, KEY_PROVIDER }, KEY_DATEANDTIME
					+ " like '%" + date +"%'", null, null, null, null, null);
			if (mCursor != null) {
				mCursor.moveToFirst();
			}
			return mCursor;
		}
	
	// ---retrieves a particular title---
	public Cursor getTitle(long rowId) throws SQLException {
		Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
				KEY_ROWID, KEY_LAT, KEY_LON, KEY_DATEANDTIME, KEY_PROVIDER }, KEY_ROWID
				+ "=" + rowId, null, null, null, null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;
	}

	// ---updates a title---
	public boolean updateTitle(long rowId, String lat, String lon,
			String provider, String dateandtime) {
		ContentValues args = new ContentValues();
		args.put(KEY_LAT, lat);
		args.put(KEY_LON, lon);
		args.put(KEY_DATEANDTIME, dateandtime);
		args.put(KEY_PROVIDER, provider);
		return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
	}
}

http://www.sqlite.org/lang_altertable.html

obrigado pela ajuda com relação ao sintaxe do sqlite, mas meu problema era onde exatamente eu deveria chamar esse código para alterar as tabelas.

O artigo abaixo explica exatamente como modificar o metodo onUpgrade para fazer tal alteração:

O metodo onUpgrade é da classe SQLiteOpenHelper.

No meu SQLiteHelper eu faço um select de todos os items; dropo a tabela; crio a tabela com a nova estrutura; adiciono todos os items novamente.

Mas um altertable resolve.

Olá

E como você faz isso para ser executado só uma vez?