升级SQlite表的难度

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

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

  • 在Android ContentProvider中连接表和通知ContentObserver的最佳实践
  • 数据库closures后,游标是否还活着?
  • 我们可以使用Guid作为Sqlite数据库中的主键
  • Android更新SQLite数据库架构?
  • 如何在Android中正确打开/closuresSQLite数据库
  • 我如何在SQLite中创build一个用户定义的函数?
  • Android线程和数据库locking
  • 如何以及在何处将sqlite(.db)文件添加到android项目中
  • 如果您使用的是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); } } } 

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