【问题标题】:Add a pre-populated table to the database without losing existing data在不丢失现有数据的情况下向数据库添加预填充表
【发布时间】:2012-03-28 10:05:18
【问题描述】:

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

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

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

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

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

执行 'ATTACH DATABASE '/data/data/my.app/databases/updateddb' as myNewDb' 时,0x2a1900 出现故障 1(无法在事务中附加数据库)

我错过了什么,有解决方法吗?还是我走错了路?

【问题讨论】:

  • 我也有同样的问题。你解决了吗?

标签: android sqlite


【解决方案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 
}

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

【讨论】:

  • 感谢您的回答,但正如您所说,这只添加了表格。那么我现在如何填充该表格,因为我无法附加原始表格?
  • 我没听懂你......你有一个只有一个表的数据库......并且在更新你的应用程序时你想在那个表中添加一个新列?或者您想在现有数据库中添加一个表?
  • 我想在现有数据库中添加一个表。但是该表需要预先填充数据,或者以某种方式必须将数据填充到表中。
  • 我在问题中添加了一些信息(希望)使问题更清楚。并感谢您对其进行调查。
  • 如果您使用的是 sqlitehelper 类..那么您将拥有它的 oncreate 方法...在那里您可以在创建表后将任何数据添加到表中...@Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE);
【解决方案2】:

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

修改数据库的唯一剩余方法是执行 SQL 命令。 所以你必须extract the table data into an SQL text file,将它与新版本的应用程序一起发布,并在onUpgrade()execute all commands in the file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多