在我的应用程序中,我有一个用于收藏品的sqlite数据库。 DB已预先填充,但用户添加数据以指示他拥有该特定项目。收藏品按类别构成,每个都有自己的表格。
因此,在应用程序的第一个版本中,我有2011年棒球运动员,由数字和名称标识。我将所有2009年到2011年的卡都放在一个数据库中(每年有一个表),它位于assets文件夹中并通过InputStream导入。到目前为止,一切都很好,用户可以添加一个标志,说他拥有一张卡片。
我的问题是现在我想添加2012年卡片,所以我在应用程序版本2的资产数据库中添加了这些作为附加表格。我无法工作的是在升级时将新的(预先填充的)表添加到现有数据库,而不会丢失用户设置的标记。
显然我不想丢失用户已输入的数据,因此没有DROP表。
我尝试通过附加更新的数据库并复制丢失的表来获取新表onUpgrade。不幸的是,似乎我无法在事务中访问表,正如我得到的错误所示:
执行'ATTACH DATABASE'/data/data/my.app/databases/updateddb'作为myNewDb'时,在0x2a1900上失败1(无法在事务中触发数据库)
我错过了什么,是否有解决方法?或者我是以错误的方式解决这个问题?
答案 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发送。