更新sqlite数据库版本?

7

我有一个数据库,想要添加一列,我更改了静态数据库版本,但是当我在设备上运行程序时,新列仍然不存在,所以我猜测我的onUpdate没有被调用,但是我不知道原因。

这是我创建数据库的方式:

     private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            createTables(db);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                              int newVersion) 
        {
            Log.w("CalendarDB", "Upgrading database from version " + oldVersion 
                  + " to "
                  + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS Events_Table");
            onCreate(db);
        }

        private void createTables(SQLiteDatabase db){
            db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " +
                    EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT," 
                    + REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS +
                    " TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);");
        }
    }

我需要做什么才能让onUpdate被调用?我尝试了遵循这个答案,但仍然没有结果。

2个回答

12
为了在Android中升级数据库,您应该将DATABASE_VERSION递增1,这样SQLOpenHelper就知道它必须调用onUpgrade方法。
记住:
只有当您调用getWritableDatabase()时才有效,否则它不会升级。如果您更改版本并调用getReadableDatabase,则会显示异常。
throw new SQLiteException("Can't upgrade read-only database from version " +
                        db.getVersion() + " to " + mNewVersion + ": " + path);

为什么呢? 当你调用getWritableDatabase时,代码会检查版本是否相同:

if (version != mNewVersion) {
                db.beginTransaction();
                try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        if (version > mNewVersion) {
                            onDowngrade(db, version, mNewVersion);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                    }
                    db.setVersion(mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
}
}

更新

好的,结果表明使用getReadableDatabase()应该是可行的,因为在代码中你总是同时获取一个WritableDatabase。所以两种方法都可以使用,这里是getReadableDatabase()的文档:

创建和/或打开数据库。这将是与getWritableDatabase()返回的相同对象,除非出现一些问题,例如满磁盘需要只读方式打开数据库。在这种情况下,将返回一个只读数据库对象。如果问题得到解决,则将来对getWritableDatabase()的调用可能会成功,在这种情况下,只读数据库对象将被关闭,并在未来返回读/写对象。


那么我应该在哪里调用getWritableDatabase呢?我应该在构造函数中调用它吗? - tyczj
无论您将在何处使用它... 我通常在ContentProvider中使用它,但如果您没有一个,它应该可以顺畅地运行在您的代码中,无论您在何处插入或更新,都必须调用getWritableDatabase,不需要强制使用它。 - Necronet
@tyczj,“那我在哪里调用getWritableDatabase呢?” 我猜你是使用SQLiteOpenHelper类来执行CRUD操作?在这种情况下,当你在代码中获取SQLiteOpenHelper的实例时,你会调用getWritableDatabase()。 - IgorGanapolsky

1

我建议你将DATABASE_VERSION增加一,这将导致应用程序调用onUpgrade()


我说过我已经这样做了,但什么也没发生。编辑* 我把 private static final int DATABASE_VERSION = 1 改成了 2 - tyczj
LogCat 中是否有任何异常? - prometheuspk

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