我有一个使用名为ANIMAL的工作表运行的应用程序。首次创建此表时,它只包含_id和animal_name列。
现在我正在努力扩展它,包括一个animal_biography专栏,但是我有点困难。首先我认为我只是升级我的CREATE_TABLE语句以包含动物生物:
private static final String DATABASE_CREATE =
"create table " + ANIMALS_TABLE +
" (_id integer primary key autoincrement, " +
"animal_name text not null, " +
"biography text not null);";
然而,看着logcat,它告诉我在尝试插入时,列传记不存在。
现在,我尝试使用onUpgrade()
并包含代码
db.execSQL("ALTER TABLE" + DATABASE_NAME);
db.execSQL(DATABASE_CREATE);
但这也没有解决问题。有没有人对如何解决这个问题有任何指示?
答案 0 :(得分:53)
如果您使用SQLiteOpenHelper
,则可以轻松升级表格。您需要实现方法onCreate
和onUpgrade
,并在类构造函数中提供数据库的当前版本。更新表时只需增加数据库版本号,在onCreate
方法中指定新表创建查询,并将ALTER TABLE
添加到onUpgrade
方法以更新以前版本的表。当Android检测到数据库版本不匹配时,它会自动调用onUpgrade
方法。参见示例:
public class OpenHelper extends SQLiteOpenHelper {
private final static int DB_VERSION = 2;
public TracksDB(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String CREATE_TBL =
"create table " + ANIMALS_TABLE +
" (_id integer primary key autoincrement, " +
"animal_name text not null, " +
"biography text not null);";
db.execSQL(CREATE_TBL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
final String ALTER_TBL =
"ALTER TABLE " + ANIMALS_TABLE +
" ADD COLUMN biography text not null;";
db.execSQL(ALTER_TBL);
}
}
}
这种升级方法是在不丢失用户数据的情况下修改表格的正确方法,尤其是在应用程序已经公开发布的情况下。