如何更新SQLite数据库而不丢失所有现有数据?

10

我正在为我的应用程序的SQLite数据库添加一个表格。所有语法都没问题,但是我在正确创建新表时遇到了一些麻烦。我已经添加了新的表格...

@Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_CREATE);
            db.execSQL(CREATE_REQUESTS);
            db.execSQL(CREATE_OVERRIDE);
        }

这是我的 onCreate 方法。我有3个表。当我更新版本号时,出现了一个错误,说“表 requests(指 CREATE_REQUESTS)已经被创建了”。我看了一下我的 onUpgrade 方法...

@Override 
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS contacts");
            onCreate(db);
        }

我了解到,在onCreate方法中引用我的DATABASE_CREATE表的行db.execSQL("DROP TABLE IF EXISTS contacts")用于删除旧表,然后下一行onCreate(db);重新创建它。 我没有在execSQL行中添加请求,这就是导致错误的原因。问题在于:我不想失去已有的两个表中的数据。是否有一种方法可以像我尝试做的那样添加表格,而不会丢失所有旧数据?谢谢。

2个回答

12

onUpgrade中,您可以做任何想做的事情。您可以使用ALTER向表中添加新列。

最坏的情况是,如果您的模式完全不同,您将需要创建新表,使用旧表中的数据填充它,然后删除旧表。

无论如何,onUpgrade旨在允许平稳升级,而不会丢失任何数据。只要您正确实现即可。


嗯,好的。我想我的担忧是,如果你在onUpgrade中这样做,当有人从头开始使用应用程序时它不会被创建,但我想只要我也把它放在onCreate方法中就没什么大问题了。谢谢! - JMRboosties
仅当现有应用程序升级时,才会调用onUpgrade。如果您从头开始启动应用程序,则只会调用onCreate。 - EboMike
5
只有在增加数据库版本时才会被调用。 - Will Tate

0

如果数据库版本为6

Ex : There is a table with 5 columns

当您升级到: 7(我在3个表中添加了1个新列)

 1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }

其中:"DATABASE_ALTER_ADD_PAPER_PAID" 是查询语句。

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

在上述两个操作之后,对于新安装的用户和应用程序升级用户来说,它将正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接