Android如何升级数据库版本并添加新表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我已经为我的应用程序创建了sqlite表,但现在我想向数据库添加一个新表。

我改变了DB版本如下:

private static final int DATABASE_VERSION = 2;

并添加字符串来创建表:

private static final String DATABASE_CREATE_color = 
   "CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";

onCreate并且onUpgrade,如下:

@Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE_incident);
        database.execSQL(DATABASE_CREATE_audio);
        database.execSQL(DATABASE_CREATE_video);
        database.execSQL(DATABASE_CREATE_image);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //drop table and add new tables when version 2 released.
        db.execSQL(DATABASE_CREATE_color);

    }
提问于
用户回答回答于

1.关于onCreate()和onUpgrade():

onCreate(..)只要应用程序是新安装的,就会调用它。 onUpgrade只要应用程序升级并启动并且数据库版本不同,就会调用它。

2.增加数据库版本:

你需要一个构造函数,如:

MyOpenHelper(Context context) {
   super(context, "dbname", null, 2); // 2 is the database version
}

重要提示:单独增加应用版本是不够的onUpgrade

3.不要忘记你的新用户:

不要忘记添加:

database.execSQL(DATABASE_CREATE_color);

到你的onCreate()方法,或者新安装的应用程序将缺少该表。

4.如何处理多个数据库随时间的变化:

当你有连续的应用程序升级,其中有几个有数据库升级,你想确保检查oldVersion

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   switch(oldVersion) {
   case 1:
       db.execSQL(DATABASE_CREATE_color);
       // we want both updates, so no break statement here...
   case 2:
       db.execSQL(DATABASE_CREATE_someothertable); 
   }
}

5.在开发过程中保持修订号码的可控性:

adb uninstall <yourpackagename>
用户回答回答于

你的代码看起来正确。我的建议是数据库已经认为它已经升级了。如果你在增加版本号之后但在添加execSQL调用之前执行了项目,则测试设备/模拟器上的数据库可能已经相信它是在版本2中。

验证这一点的快速方法是将版本号更改为 - 如果在此之后升级,则知道这仅仅是因为你的设备相信它已经升级。

扫码关注云+社区