我需要将我在市场上的Android应用程序更新到下一个版本。下一个版本我需要更新sqlite DB而不会丢失现有数据。
在版本1中,我没有在运行时创建表,而是从“assets”文件夹中获取数据库文件,并将其复制到我的应用程序的系统数据库路径中。 请参阅此链接 http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
我的应用程序的下一个版本我修改了exsting表列并添加了额外的记录,并且还有很少的新表。我已经更新了数据库并复制到资产文件夹。
这适用于第一次购买应用的用户,但不适用于现有用户,我的问题是如何在不丢失现有数据的情况下更新第一版用户数据库
萨姆。
答案 0 :(得分:3)
@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);
}
}
}
答案 1 :(得分:1)
准备sql查询以升级数据库。 如果数据库存在,则执行更新其他从资产复制数据库。
在您提供的教程中是这样的代码:
if(dbExist){
//do nothing - database already exist
}else{
在//do nothing - database already exist
放置升级代码的地方。
答案 2 :(得分:1)
您可以尝试我在此博客文章中描述的类似补丁的解决方案。它将有助于增量升级,并将在您构建越来越多的版本时继续扩展。
http://www.greenmoonsoftware.com/2012/02/sqlite-schema-migration-in-android/
答案 3 :(得分:0)
在您的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;
}