升级SQlite表格时遇到的困难

13

我有一个名为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,当试图将其插入时,告诉我列biography不存在。

现在,我已经尝试通过使用onUpgrade()并包含代码来升级数据库。

db.execSQL("ALTER TABLE" + DATABASE_NAME);
db.execSQL(DATABASE_CREATE);

但这也没有解决问题。有没有人能指点一下如何解决这个问题?


好的,我已经成功找到了解决问题的方法。我需要从应用程序中删除数据库,这样它就可以在启动时使用修订后的代码创建一个全新的表格。我按照以下步骤删除了数据库:File dbFile = getDatabasePath("Path_Name"); dbFIle.delete(); - Php Pete
你可以通过使用DDMS文件浏览器来删除数据库文件。 - GrAnd
1个回答

53

如果你正在使用 SQLiteOpenHelper,那么升级表格将变得很容易。您需要实现方法onCreateonUpgrade,并在类构造函数中提供当前数据库版本。当更新表格时,只需增加数据库版本号,在onCreate方法中指定新的表格创建查询,并在onUpgrade方法中添加ALTER TABLE以更新以前版本的表格。当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);
        }
    }
}

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


1
@GrAnd - 感谢您的回答,这对我很有帮助。但是,该示例不起作用,因为您无法添加“非空”列而不指定默认值,例如: “ADD COLUMN biography text not null default default_biography” - Koger
1
我有同样的问题,我已经实现了上述方法,我改变了版本号,日志/调试也显示onUpgrade被调用,并且没有任何异常(我假设它成功执行了查询)。但是当我尝试加载项目时(目前没有记录,因为我已经删除了表并重新创建),它仍然抛出异常,新列不存在。卸载应用程序也没有效果。 - PHP Avenger
那么改变传入版本的值是什么信号让OpenHelper进入onUpgrade呢? 如果在增加版本后包含了alter tables方法,更改“create tables”字符串是可以的吗?请检查以确保我没有混淆,我只是需要澄清一下。 - AlleyOOP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接