当前位置: 首页 > 知识库问答 >
问题:

当模式在ORMLite中更改时删除列

耿玄裳
2023-03-14

我正在使用Android和ORMLite。我是新手,正在将数据库升级到版本2。我有“Auto”类,需要删除列别名。

    @DatabaseTable(tableName = "Auto")
public class Auto {

    public static final String ALIAS                 = "alias";
    public static final String PLACA                 = "placa";


    @DatabaseField(generatedId = true, columnName = "ID")
    private int id;
    @DatabaseField(canBeNull = false, columnName = ALIAS)
    private String alias;
    @DatabaseField(canBeNull = false, columnName = PLACA)

    public Auto()
    {
        //ORMLite needs a no-arg constructor
    }

    public Auto(String alias, String placa) {
        this.alias                  = alias;
        this.placa                  = placa;
    }

…..
…..
}

我将类Auto更改为...

@DatabaseTable(tableName = "Auto")
public class Auto {

    public static final String PLACA                 = "placa";


    @DatabaseField(generatedId = true, columnName = "ID")
    private int id;
    @DatabaseField(canBeNull = false, columnName = PLACA)

    public Auto()
    {
        //ORMLite needs a no-arg constructor
    }

    public Auto(String alias, String placa) {       this.placa                  = placa;
    }

…..
…..
}

我需要知道在执行“onUpgradeMethod”时,ORMLite是否会自动删除列别名,或者我必须手动这样做。

@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
   if(oldVersion == 1) {
   try {
      Dao dao;
      dao = getAutoDao();
      dao.executeRaw("ALTER TABLE `Auto` DROP COLUMN alias;");

   } catch (SQLException e) {
      Log.e(DatabaseHelper.class.getName(), "Error ", e);

   }
   }
}

共有1个答案

赫连睿
2023-03-14

这个链接帮助我解决这个问题。

在SQLite中删除列

常见问题解答SQLite 11

从SQL中删除列

表升级前保存数据

删除表,如果它已经存在,然后重新创建它?

SQLite对ALTER TABLE的支持有限,您可以使用它将列添加到表的末尾或更改表的名称。如果要对表的结构进行更复杂的更改,则必须重新创建表。您可以将现有数据保存到临时表中,删除旧表,创建新表,然后将数据从临时表中复制回。

例如,假设您有一个名为“t1”的表,其中列名为“a”、“b”和“c”,并且您想从此表中删除列“c”。以下步骤说明了如何做到这一点:

BEGIN TRANSACTION; 
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1; 
DROP TABLE t1; CREATE TABLE t1(a,b); INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup; 
COMMIT;

根据菲尔的评论,可能的解决方案是这样的。4.

所以你的选择是:

>

  • 让事情保持原样,

    添加一个新列,将所有数据从旧数据复制到新数据作为升级的一部分,然后完全忽略旧列,或者

    使用删除/创建策略进行升级:将表中的数据备份到临时表中,删除表,按您希望的方式重新创建,将所有数据复制回其中,最后删除临时表。

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

    我决定从列中删除数据,但不删除列,这类似于解决方案2。

  •  类似资料:
    • 我正在为我们的cassandra系统制定cassandra备份和恢复策略,并试图了解cassandra中的备份和稳定恢复是如何工作的。以下是我的观察和相关问题(我的需求是建立一个备用/备份集群,如果主集群关闭,它将成为活动的..所以我想让它们在数据方面保持同步,所以我想在我的活动集群上进行定期备份,并恢复到备用集群) 已进行快照备份。在卡桑德拉放下了一张桌子。停止了卡桑德拉,从快照备份中恢复(将表

    • 我正在寻找一种通过改变散列来改变部分样式的方法。让我以一个例子来解释: > 当前URL为: 然后单击复选框,URL将更改为: 我想更改类的。 我尝试了以下代码,但它不起作用: 实际上,每次哈希更改时,控制台中都不会出现任何内容。

    • 问题内容: 我知道可以在运行时通过JavaScript添加新的CSS类定义。但… 如何在运行时更改/删除CSS类定义? 例如,假设我有以下课程: 我想要的是在运行时更改类的规则,以便使用该类的页面中的每个元素都将受到影响。 而且,我也想知道如何删除类定义。 问题答案: 在运行时更改CSS规则并不难,但是显然很难找到想要的规则。PPK可以在quirksmode.org上对此进行快速浏览。 您将要使用

    • 用EraseMode属性适合于画面变化最小的简单图的长序列。这里有一个例子放映模拟的布朗运动。指定点的数目,例如 n = 20 以及温度或速度,例如 s = .02 这两个参数的最佳值决定于你的计算机的速度。生成n个随机点,其(x,y)坐标介乎-1/2和+1/2。 x = rand(n,1)-0.5; y = rand(n,1)-0.5; 在边界为-1和1的正方形作出各点。保存点的向量的句柄

    • 我想更改数据库中< code>Employees表的模式名。当前表中的< code>Employees数据库模式名为< code>dbo,我想将其更改为< code>exe。我该怎么做? 例子: 从 收件人 我尝试了这个查询: 但是这给了我一个错误: 无法更改架构“exe”,因为它不存在或您没有权限。 我错过了什么?

    • 问题内容: 我有一位表格讲师,我想删除工资范围在一定范围内的记录。一种直观的方式是这样的: 但是,在安全模式下,如果不提供主键(ID),则无法删除记录。 所以我写下面的sql: 但是,有一个错误: 我很困惑,因为当我写 它不会产生错误。 我的问题是: 此错误消息的真正含义是什么,为什么我的代码是错误的? 如何重写此代码以使其在安全模式下工作? 谢谢! 问题答案: 到处搜寻,最流行的答案似乎是“只关