2011-12-24 99 views
7

我有一个数据库,我想添加一列,我改变了静态数据库版本,但是当我在我的设备上运行该程序的新列仍然不存在,所以我猜我的onUpdate没有被调用,我是不知道为什么。更新sqlite数据库版本?

这是我怎么回事创建数据库

 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得到叫什么?我尝试以下this answer,但还是没有结果

回答

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); 

但是为什么? 你看,当你调用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(),因为在代码中你总是越来越上班一个可写的数据库。因此,它应与工作方法,这里是getReadableDatabase()的文档:

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

+0

那么我在哪里调用getWritableDatabase呢?我应该在我的构造函数中调用它吗? – tyczj 2011-12-24 23:17:22

+0

无论你在哪里使用它...我通常在我的ContentProvider中使用它,但如果你没有它,它应该在你的代码中流利地运行,任何你要插入或更新getWritableDatabase的地方必须是所谓的,它不是迫使它的使用。 – Necronet 2011-12-24 23:51:29

+0

@tyczj〜“那么我应该在哪里调用getWritableDatabase呢?”我假设你正在使用SQLiteOpenHelper类来执行CRUD操作?在这种情况下,当您在代码中获取SQLiteOpenHelper的实例时,您将调用getWritableDatabase()。 – 2013-12-13 16:09:10

1

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

+0

我说,我这样做,并且它没有做任何事情 编辑*我改变了'私有静态最终诠释DATABASE_VERSION = 2'从'1'到'2' – tyczj 2011-12-24 22:29:43

+0

有没有在logcat的任何异常? – prometheuspk 2011-12-24 22:40:03