更新sqlite数据库版本?

tyc*_*czj 7 database sqlite android

我有一个数据库,我想添加一个列,我更改了静态数据库版本,但是当我在我的设备上运行程序时,新列仍然没有,所以我猜我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);");
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有什么我需要做的onUpdate才能让它被召唤?我尝试了这个答案,但仍然没有结果

Nec*_*net 11

为了升级Android中,你应该通过一个递增DATABASE_VERSION,为了使SQLOpenHelper知道它必须调用onUpgrade方法的数据库.

Rembember

这仅在您调用getWritableDatabase()时有效,否则将无法升级.如果您更改版本并调用getReadableDatabase,它将显示异常

throw new SQLiteException("Can't upgrade read-only database from version " +
                        db.getVersion() + " to " + mNewVersion + ": " + path);
Run Code Online (Sandbox Code Playgroud)

但为什么?你看到当你调用 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();
}
}
Run Code Online (Sandbox Code Playgroud)

更新

事实证明它应该与getReadableDatabase()一起使用,因为在代码中你总是得到一个WrittableDatabase.所以它应该适用于这两种方法,这里是getReadableDatabase()的文档:

创建和/或打开数据库.这将是getWritableDatabase()返回的同一对象,除非某些问题(例如完整磁盘)要求以只读方式打开数据库.在这种情况下,将返回只读数据库对象.如果问题是固定的,以getWritableDatabase未来()调用可能会成功,在这种情况下,只读数据库对象将被关闭和读/写对象将在未来返回.