【问题标题】:Drop a column when the schema changes in ORMLite当 ORMLite 中的架构更改时删除一列
【发布时间】:2023-03-28 15:33:01
【问题描述】:

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

    @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;
    }

…..
…..
}

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

@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);

   }
   }
}

【问题讨论】:

    标签: android database schema upgrade ormlite


    【解决方案1】:

    这个链接帮助我解决它。

    Drop column in SQLite

    FAQ SQLite 11

    Delete column from SQL

    save data before table upgrade

    Drop table if it already exists and then re-create it?

    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;
    

    根据 Phil 的 cmets,可能的解决方案是这样的。 4

    所以你的选择是:

    1. 保持原样,

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

    3. 使用删除/创建策略进行升级:将表中的数据备份到临时表中,删除表,根据需要重新创建它 是,将所有数据复制回其中,最后删除临时 表。

    数据库升级总是很紧张的事情(需要很多错误 处理,大量测试),坦率地说,如果名称是唯一的东西 关心你,我会不管它(选项1)。如果你真的需要 更改它,然后选项 2 风险较低,但会留下一个“死”列,并且 周围的数据。选项 3 可能是您的选择,例如,如果 数据占整个数据库大小的很大比例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多