我需要在市场上更新我的android应用程序到下一个版本。下一个版本,我需要在不丢失现有数据的情况下更新sqlite数据库。
在版本1中,我没有在运行时创建表,而是从"assets"文件夹中获取数据库文件并复制到我的应用程序的系统数据库路径中。请参阅此链接http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
我的应用程序的下一个版本,我已经修改了现有的表列,并添加额外的记录,也有一些新的表。我已经更新了数据库并复制到资产文件夹。
这将适用于第一次购买应用程序的用户,但不适用于现有用户,我的问题是如何在不丢失现有数据的情况下更新版本1用户数据库
山姆。
@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");
if(oldVersion == 2 && newVersion == 3)
{
db.execSQL("ALTER TABLE xyz ADD bobby int default 0");
}
else
{
db.execSQL("DROP TABLE IF EXISTS xyz");
onCreate(db);
}
}
}
准备sql查询升级数据库。如果数据库存在,则执行更新,否则从资产中复制数据库。
在你提供的教程中是这样的代码:
if(dbExist){
//do nothing - database already exist
}else{
在//do nothing - database already exist
的位置放置您的升级代码
您可以尝试我在这篇博文中描述的类似补丁的解决方案。它将有助于增量升级,并将随着您构建越来越多的版本而继续扩展。
http://www.greenmoonsoftware.com/2012/02/sqlite-schema-migration-in-android/在你的SQLiteHelper类DATABASE_VERSION变量应该是最新的版本。假设早期的DATABASE_VERSION为1,而当您正在升级时,它必须为2。
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
现在将旧数据库版本升级到新版本。如果你没有在数据库中设置最新的版本号,那么onUpgrade(…)会被反复调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
logger.info("DBManager - :::: Upgrading database from version " + oldVersion+ " to "+ newVersion + ", which will modify some old table");
String sqlFileName = "update_version_1.sql";
int totalSQLQueries = executeSQLScript(db, sqlFileName);
logger.info("DBManager - :::: Upgrading database from version - " +"Total " + totalSQLQueries +" queries executed succesfully from " +sqlFileName);
if(db.getVersion() == oldVersion) {
db.setVersion(newVersion);
logger.info("DBManager - :::: DB Version upgraded from " +oldVersion +" to " +newVersion);
}
}
数据库修改代码必须在事务中编写。查看下面的代码作为使用事务进行数据库升级的示例:-
private int executeSQLScript(SQLiteDatabase db, String sqlFileName)
{
int count = 0;
InputStream inputStream = null;
BufferedReader bufferReader = null;
try
{
db.beginTransaction();
inputStream = localContext.getApplicationContext().getAssets().open(sqlFileName);
bufferReader = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while((inputLine = bufferReader.readLine()) != null)
{
if(inputLine.trim().equalsIgnoreCase("BEGIN;") || inputLine.trim().equalsIgnoreCase("END;"))
{
continue;
}
else
{
db.execSQL(inputLine);
count = count + 1;
}
}
db.setTransactionSuccessful();
}
catch(Exception ex) {
ex.printStackTrace();
}
finally
{
if(bufferReader != null)
{
try {
bufferReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream != null)
{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
db.endTransaction();
}
return count;
}