如何在不丢失现有数据的情况下升级Android应用程序版本一个自有SQLite数据库

时间:2011-07-14 15:22:32

标签: android

我需要将我在市场上的Android应用程序更新到下一个版本。下一个版本我需要更新sqlite DB而不会丢失现有数据。

在版本1中,我没有在运行时创建表,而是从“assets”文件夹中获取数据库文件,并将其复制到我的应用程序的系统数据库路径中。 请参阅此链接 http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

我的应用程序的下一个版本我修改了exsting表列并添加了额外的记录,并且还有很少的新表。我已经更新了数据库并复制到资产文件夹。

这适用于第一次购买应用的用户,但不适用于现有用户,我的问题是如何在不丢失现有数据的情况下更新第一版用户数据库

萨姆。

4 个答案:

答案 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;
    }