将预先填充的表添加到数据库,而不会丢失现有数据

时间:2012-03-28 10:05:18

标签: android sqlite

在我的应用程序中,我有一个用于收藏品的sqlite数据库。 DB已预先填充,但用户添加数据以指示他拥有该特定项目。收藏品按类别构成,每个都有自己的表格。

因此,在应用程序的第一个版本中,我有2011年棒球运动员,由数字和名称标识。我将所有2009年到2011年的卡都放在一个数据库中(每年有一个表),它位于assets文件夹中并通过InputStream导入。到目前为止,一切都很好,用户可以添加一个标志,说他拥有一张卡片。

我的问题是现在我想添加2012年卡片,所以我在应用程序版本2的资产数据库中添加了这些作为附加表格。我无法工作的是在升级时将新的(预先填充的)表添加到现有数据库,而不会丢失用户设置的标记。

显然我不想丢失用户已输入的数据,因此没有DROP表。

我尝试通过附加更新的数据库并复制丢失的表来获取新表onUpgrade。不幸的是,似乎我无法在事务中访问表,正如我得到的错误所示:

  

执行'ATTACH DATABASE'/data/data/my.app/databases/updateddb'作为myNewDb'时,在0x2a1900上失败1(无法在事务中触发数据库)

我错过了什么,是否有解决方法?或者我是以错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:1)

更新应用时,使用onUpgrade方法将表添加到现有数据库中。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("create table "
        + LIBRARY + "( " + COLUMN_ID
        + " integer primary key autoincrement, " + COLUMN_NAME
        + " text not null, "+COLUMN_URL
        + " text not null);");
         //and populate the table 
}

这只会在现有数据库中添加一个表..

答案 1 :(得分:0)

在事务中调用onUpgrade()方法,因此您不能简单地附加另一个数据库文件。

修改数据库的唯一剩余方法是执行SQL命令。 因此,您必须extract the table data into an SQL text file,使用新版本的应用以及onUpgrade()execute all commands in the file发送。