更新数据库

时间:2012-06-05 12:24:40

标签: android database

欢迎。
数据库以这种方式更新:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion) {
        Log.e("TAG", "New database version exists for upgrade.");

        try {
            Log.e("TAG", "Copying database...");
            copyDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
问题是我在统计数据库中有一个表,我想将这个表中的数据命令复制到新数据库中。

我该怎么办?问一个例子。

对我糟糕的英语表示遗憾和抱歉。


我试着这样做:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion) {
        Log.e("TAG", "New database version exists for upgrade.");

        db.beginTransaction();
        try {
            Log.e("TAG", "Copying database...");
            this.getReadableDatabase();
            ArrayList<Statystyka> statystyki = getAllStatistic();
            copyDataBase();
            for (int i = 0; statystyki.size() >= i; i++) {
                addStat(statystyki.get(i).getId_pytania(),
                        statystyki.get(i).getIlosc_rozwiazan(), statystyki
                                .get(i).getIlosc_poprawnych(), statystyki
                                .get(i).getIlosc_blednych());
            }
            db.setTransactionSuccessful();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        db.endTransaction();
    }

}

但我收到错误:

java.lang.IllegalStateException:递归调用getReadableDatabase

如何打开数据库以加载数据?

2 个答案:

答案 0 :(得分:0)

升级数据库后,旧表仍然存在,您只需要更改为新的模式版本。见this documentation

例如::
假设您必须在表格中添加一个新列::

String alter_table_command=" ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + NEW_COLUMN + " TEXT; ";
db.execSQL( alter_table_command );

了解ALTER TABLE here

注意::如果您想从另一个数据库中复制一个表,请按照@vipul上面的建议使用该解决方案。

答案 1 :(得分:0)

onUpgrade不会创建新数据库。它只是让您有机会创建新的列或表,或以某种方式更新数据库中的数据,使其与新版本兼容。

因此,您不需要将任何数据复制到新数据库中。