如何在不丢失现有数据的情况下升级android app version one自有SQLite数据库
我需要将市场上的android应用程序更新到下一个版本。下一个版本我需要在不丢失现有数据的情况下更新sqlite DB 在版本1中,我没有在运行时创建表,而是从“资产”文件夹中获取数据库文件,并复制到应用程序的系统数据库路径中。 请参阅此链接 我的应用程序的下一个版本我已经修改了现有的表列并添加了额外的记录,而且也没有什么新表。我已经更新了数据库并复制到了资产文件夹 这将适用于首次购买应用程序的用户,但不适用于现有用户,我的问题是如何在不丢失现有数据的情况下更新version one用户数据库如何在不丢失现有数据的情况下升级android app version one自有SQLite数据库,android,Android,我需要将市场上的android应用程序更新到下一个版本。下一个版本我需要在不丢失现有数据的情况下更新sqlite DB 在版本1中,我没有在运行时创建表,而是从“资产”文件夹中获取数据库文件,并复制到应用程序的系统数据库路径中。 请参阅此链接 我的应用程序的下一个版本我已经修改了现有的表列并添加了额外的记录,而且也没有什么新表。我已经更新了数据库并复制到了资产文件夹 这将适用于首次购买应用程序的用户,但不适用于现有用户,我的问题是如何在不丢失现有数据的情况下更新version one用户数据库
Sam.准备sql查询以升级数据库。 如果数据库存在,则执行更新else从资产复制数据库 在您提供的教程中有这样的代码:
if(dbExist){
//do nothing - database already exist
}else{
在where is
//什么都不做-数据库已经存在
请输入升级代码。您可以尝试我在本文中介绍的类似补丁的解决方案。它将有助于增量升级,并将随着您构建越来越多的版本而继续扩展
@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);
}
}
}
在SQLiteHelper类中,数据库版本变量应为最新版本。假设早期的数据库_版本是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;
}
因此,我不想更新版本号并保持onUpgrade方法不变?您可以使用
onUpgrade
,但不需要。在您所基于的教程中,有空的onUpgrade和onCreate
方法。但我认为在将来考虑升级数据库时,最好实现onCreate
和onUpdate
。如果是这样,则重构代码以使用这些方法,并在创建后设置db版本:SQLiteDatabase.setVersion(int)
。当您拥有db版本时,您可以受益于onUpgrade
。这就是我要做的,如果我错了,请更正我:将新数据库复制到资产文件夹,以便首次获得应用程序的用户拥有最新的db,如果数据库存在并且新版本号为2,我将添加一个单独的方法,我将执行ALTERTABLE并插入record statmens。。