2011-04-16 155 views
13

我有一个运行着名为ANIMAL的工作表的应用程序。首次创建此表时,它仅由_id和animal_name列组成。升级SQlite表时遇到困难

现在我想就可以扩大,包括animal_biography列,但我有一个小difficulty.At起初,我以为我只是升级我的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

好吧,我设法找到了解决这个问题。 我需要从应用程序中删除数据库,以便在启动时使用修改的代码创建一个全新的表,我删除了数据库,如下所示: File dbFile = getDatabasePath(“Path_Name”); dbFIle.delete(); – Jnanathan 2011-04-16 16:22:10

+0

只需使用DDMS文件浏览器即可删除数据库文件。 – GrAnd 2011-04-16 17:14:16

回答

52

如果您使用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); 
     } 
    } 
} 

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

+0

很酷,谢谢让事情更清晰。 – Jnanathan 2011-04-24 17:33:48

+1

@GrAnd - 感谢您的回答,这对我有很大的帮助。然而这个例子不起作用,因为你不能添加“not null”列而没有指定默认值,如: “ADD COLUMN biography text not null default default_biography” – Koger 2011-11-29 13:21:13

+1

我有同样的问题,我已经实现了上面的方法,我更改了版本号,log/debug也显示onUpgrade被调用,并且根本没有异常(我假设它成功执行了查询)。但是当我尝试加载项目(目前没有记录,因为我已经删除表并重新创建)它仍然会抛出异常新列不存在。 卸载应用程序也不起作用。 – 2013-11-13 23:02:35