升级SQlite表的难度

时间:2011-04-16 14:40:15

标签: android sqlite alter

我有一个使用名为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);

但这也没有解决问题。有没有人对如何解决这个问题有任何指示?

1 个答案:

答案 0 :(得分:53)

如果您使用SQLiteOpenHelper,则可以轻松升级表格。您需要实现方法onCreateonUpgrade,并在类构造函数中提供数据库的当前版本。更新表时只需增加数据库版本号,在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);
        }
    }
}

这种升级方法是在不丢失用户数据的情况下修改表格的正确方法,尤其是在应用程序已经公开发布的情况下。