如何使用ormLite在android中的现有实体中添加新字段?

时间:2016-01-14 07:55:43

标签: android ormlite

OLD ENTITY :我有一个实体,我忘了在某些字段上添加@DatabaseField注释

@DatabaseTable
public class Card {
    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(unique = true)
    private String cardNumber;
    @DatabaseField
    private String nameOnCard;
    private String ccv;
    private String validFrom;
    private String validTill;
    private String pin;
    //Required by ormLite
    public Card() {
    }
//skipped the getter setters below
}

我有一个编写配置的类,这里是代码。

package net.udevs.db;
import com.j256.ormlite.android.apptools.OrmLiteConfigUtil;
import net.udevs.entity.Card;

public class OrmLiteSqlLiteConfigGenerator extends OrmLiteConfigUtil {
    private final static Class<?>[] entityClasses=new Class[]{EmailAccount.class, Card.class};
    public static void main(String... args) throws Exception{
        writeConfigFile("ormlite_config.txt",entityClasses);
    }
}

生成的配置文件低于&amp;通过查看它我知道这些字段在数据库中没有更新。

#
# generated on 2016/01/14 01:13:56
#
# --table-start--
dataClass=net.udevs.entity.Card
tableName=card
# --table-fields-start--
# --field-start--
fieldName=id
generatedId=true
# --field-end--
# --field-start--
fieldName=cardNumber
unique=true
# --field-end--
# --field-start--
fieldName=nameOnCard
# --field-end--
# --table-fields-end--
# --table-end--
#################################

NEW ENTITY:现在我添加了缺少的@DatabaseField注释。

public class Card {
    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(unique = true)
    private String cardNumber;
    @DatabaseField
    private String nameOnCard;
    @DatabaseField
    private String ccv;
    @DatabaseField
    private String validFrom;
    @DatabaseField
    private String validTill;
    @DatabaseField
    private String pin;

    public Card() {
    }

    public Card(int id, String cardNumber, String nameOnCard, String ccv, String validFrom, String validTill, String pin) {

        this.id = id;
        this.cardNumber = cardNumber;
        this.nameOnCard = nameOnCard;
        this.ccv = ccv;
        this.validFrom = validFrom;
        this.validTill = validTill;
        this.pin = pin;
    }
//skipped the getter setters below
}

&安培;然后我再次运行OrmLiteConfigUtil类,但配置文件没有改变。

2 个答案:

答案 0 :(得分:4)

您可以将@DatabaseField注释添加到缺少的字段并增加数据库版本,然后在onUpgrade方法中执行此操作

@Override
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        if(oldVersion == 1) {
            try {
                Dao dao = getCardDao();
                dao.executeRaw("ALTER TABLE `Card` ADD COLUMN ccv STRING;");
                dao.executeRaw("ALTER TABLE `Card` ADD COLUMN validFrom STRING;");
            } catch (SQLException e) {
                Log.e(DatabaseHelper.class.getName(), "Error ", e);
            }
        }
    }

最后运行OrmLiteConfigUtil,配置文本文件应该会改变。

通过这种方式,您不必擦除数据库并丢失数据。

答案 1 :(得分:1)

您可以执行以下操作以添加新列:

  1. 首先将数据库版本从1更新到2。

  2. onUpgrade()方法中,您可以删除以前的表格:

    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
    {
        try
        {
            TableUtils.dropTable(connectionSource, ABC.class, true);
            TableUtils.dropTable(connectionSource, XYZ.class, true);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        onCreate(database, connectionSource);
    }
    
  3. OnCreate()中,再次创建表:

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        try
        {
            TableUtils.createTable(connectionSource, ABC.class);
            TableUtils.createTable(connectionSource, XYZ.class);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }
    
  4. 在ABC表中,您可以添加另一列:

    @DatabaseField(columnName = AppConstants.TABLE_COLUMN_IS_SHOW_AUTOGRAPH, defaultValue = "false")
    private boolean mShowAutoGraph;
    
  5. 注意:请确保使用以下值编辑ormlite_config.txt文件:

    fieldName=mShowAutoGraph // field name used in table
    columnName=show_autograph // key used in AppConstants.TABLE_COLUMN_IS_SHOW_AUTOGRAPH
    defaultValue=false
    # --field-end--
    # --table-fields-end--
    # --table-end--
    

    请确保此处使用--end--标签代替表格。从该表的上一个条目中删除end的标签。如果不这样做,将永远看不到您的专栏。