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

时间:2011-03-04 01:56:55

标签: android sqlite

我正在为我的应用程序的SQLite DB添加一个表。我的所有语法都很好,而不是问题。但是我在创建新表时遇到了一些麻烦。我添加了新表....

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

我的创建方法。我有3张桌子。当我更新版本号时,我收到一条错误消息“已经创建了表请求(指的是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 个答案:

答案 0 :(得分:13)

您可以在onUpgrade中执行任何操作。您可以使用ALTER向表中添加新列。

最糟糕的情况是,如果您的架构完全不同,则必须创建新表,使用旧表中的数据填充它,然后删除旧表。

无论如何,onUpgrade旨在实现平滑升级而不会丢失任何数据。您可以正确实施它。

答案 1 :(得分: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;";

完成上述两项操作后,它将适用于全新安装用户和应用升级用户