如何使用 ormLite 将新字段添加到 android 中的现有实体中?
How to add new fields into an existing entity in android using 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
}
我有一个写配置的class,这里是代码。
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);
}
}
下面是生成的配置文件,通过查看我知道数据库中的字段没有更新。
#
# 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--
#################################
新实体:现在我添加了缺少的@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 class,但是配置文件没有改变。
您可以将@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 到 2。
在 onUpgrade()
方法中,您可以删除之前的 tables:
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);
}
在OnCreate()
中,再次创建table:
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try
{
TableUtils.createTable(connectionSource, ABC.class);
TableUtils.createTable(connectionSource, XYZ.class);
}
catch (SQLException ex)
{
ex.printStackTrace();
}
}
在您的 ABC table 中,您可以添加另一列:
@DatabaseField(columnName = AppConstants.TABLE_COLUMN_IS_SHOW_AUTOGRAPH, defaultValue = "false")
private boolean mShowAutoGraph;
注意:确保使用这些值编辑您的 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--
这里确保你结束 table 而不是 --end--
标签。从此 table 的先前条目中删除结束标记。如果不这样做,您将永远看不到您的专栏。
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
}
我有一个写配置的class,这里是代码。
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);
}
}
下面是生成的配置文件,通过查看我知道数据库中的字段没有更新。
#
# 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--
#################################
新实体:现在我添加了缺少的@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 class,但是配置文件没有改变。
您可以将@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 到 2。
在
onUpgrade()
方法中,您可以删除之前的 tables: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); }
在
OnCreate()
中,再次创建table:@Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { try { TableUtils.createTable(connectionSource, ABC.class); TableUtils.createTable(connectionSource, XYZ.class); } catch (SQLException ex) { ex.printStackTrace(); } }
在您的 ABC table 中,您可以添加另一列:
@DatabaseField(columnName = AppConstants.TABLE_COLUMN_IS_SHOW_AUTOGRAPH, defaultValue = "false") private boolean mShowAutoGraph;
注意:确保使用这些值编辑您的
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--
这里确保你结束 table 而不是
--end--
标签。从此 table 的先前条目中删除结束标记。如果不这样做,您将永远看不到您的专栏。