【问题标题】:OrmLite - save data before table upgradeOrmLite - 表升级前保存数据
【发布时间】:2013-06-12 21:36:27
【问题描述】:

可以在我的模型更改数据库之前保存表中的数据吗?

例如,我重命名一列并且不会丢失数据。因此,即我想从 c1 列中获取所有数据,将我的列重命名为 c2 并将所有数据写回。

【问题讨论】:

  • 我不太明白您要做什么。您可能需要编辑您的帖子以提供更多细节。
  • 我意识到我在模型更新后丢失了一些数据。所以我想写一个补丁之类的东西来在它的模式升级之前从表中加载一些数据。架构升级后,我将先前加载的数据写回表或另一个表。

标签: android ormlite


【解决方案1】:

这是来自ORMLite documentation 的引用:“您不能重命名或删除列或更改约束”。

所以你的选择是:

  1. 保持原样,
  2. 添加一个新列,将所有数据从旧列复制到新列,作为升级的一部分,完全忽略旧列,或者
  3. 使用删除/创建策略进行升级:将表中的数据备份到临时表中,删除表,根据需要重新创建,将所有数据复制回其中,最后删除临时表。

数据库升级总是令人紧张的事情(需要大量的错误处理、大量的测试),坦率地说,如果名称是唯一让您担心的事情,我会不理会它(选项 1) .如果您确实需要更改它,那么选项 2 风险较低,但会留下一个“死”列和数据。例如,如果数据占整个数据库大小的很大比例,则选项 3 可能是您的选择。

【讨论】:

    【解决方案2】:

    我想从 c1 列获取所有数据,将我的列重命名为 c2 并将所有数据写回。

    Sqlite 不支持重命名列,因此这在 Android 下不起作用。但是,您当然可以添加一个额外的列。在 Android/ORMLite 下有一些关于架构更改的好文档。请参阅此页面:

    http://ormlite.com/docs/upgrade-schema

    例如,您可以进行以下架构更新:

    dao.executeRaw(
        "ALTER TABLE `account` ADD COLUMN hasDog BOOLEAN DEFAULT 0;");
    dao.updateRaw("UPDATE `account` SET hasDog = 1 WHERE dogCount > 0;");
    

    【讨论】:

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