Да, это так,
Вам необходимо написать свой метод onUpgrade()
при обновлении таблицы. В настоящее время я использую следующее для создания новой таблицы с новым столбцом и для копирования всех моих текущих данных. Надеюсь, вы сможете адаптировать это к своему коду.
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion);
db.beginTransaction();
try {
db.execSQL("CREATE TABLE IF NOT EXISTS " + DATABASE_UPGRADE);
List<String> columns = GetColumns(db, DATABASE_TABLE);
db.execSQL("ALTER table " + DATABASE_TABLE + " RENAME TO 'temp_" + DATABASE_TABLE + "'");
db.execSQL("create table " + DATABASE_UPGRADE);
columns.retainAll(GetColumns(db, DATABASE_TABLE));
String cols = join(columns, ",");
db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", DATABASE_TABLE, cols, cols, DATABASE_TABLE));
db.execSQL("DROP table 'temp_" + DATABASE_TABLE + "'");
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
}
public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("select * from " + tableName + " limit 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}
public static String join(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0)
buf.append(delim);
buf.append((String) list.get(i));
}
return buf.toString();
}
Содержит onUpgrade()
и два вспомогательных метода. DATABASE_UPGRADE
- строка, содержащая базу данных обновления:
private static final String DATABASE_UPGRADE =
"notes (_id integer primary key autoincrement, "
+ "title text not null, "
+ "body text not null, "
+ "date text not null, "
+ "edit text not null, "
+ "reminder text, "
+ "img_source text, "
+ "deletion, "
+ "priority)";
Краткое примечание о том, как это работает:
- Проверьте, существует ли текущая версия таблицы (она никогда не должна существовать), так как
onUpgrade()
не должна вызываться в этом случае.
- Поскольку это не удалось, получите список столбцов из текущей таблицы (используется вспомогательная функция
GetColumns()
).
- переименуйте старую таблицу в temp_OLDTABLENAME.
- Создать в новой версии базы данных дополнительные столбцы (в настоящее время пустые).
- получить всю информацию из старой версии базы данных.
- вставить его в новую базу данных
- удалить старую таблицу (temp_OLDTABLENAME).
Я попытался написать это достаточно универсально, поэтому все, что мне нужно сделать, это обновить DATABASE_UPGRADE дополнительными столбцами, и это обрабатывает все остальное. До сих пор у меня работало до 3-х апгрейдов.