7

按照这个很好的例子http://code.google.com/p/openintents/source/browse/trunk/notepad/NotePad/src/org/openintents/notepad/NotePadProvider.java?r=3878

我实现了我的 sqlite 数据库升级系统。但是在上面的链接中,唯一的示例显示了如何在表中添加新列。onUpgrade 方法中的一段代码是

 try {
      db.execSQL("ALTER TABLE " +   NOTES_TABLE_NAME + " ADD COLUMN "
                                                                    + Notes.TAGS + " TEXT;");
      db.execSQL("ALTER TABLE " + NOTES_TABLE_NAME + " ADD COLUMN "
                                                                    + Notes.ENCRYPTED + " INTEGER;");
      db.execSQL("ALTER TABLE " + NOTES_TABLE_NAME + " ADD COLUMN "
                                                                    + Notes.THEME + " TEXT;");
      } catch (SQLException e) {
      Log.e(TAG, "Error executing SQL: ", e);
      // If the error is "duplicate column name" then everything is fine,
      // as this happens after upgrading 2->3, then downgrading 3->2, 
      // and then upgrading again 2->3.
      }
      //  *** other upgrade from version x->y
      // ***

在 onCreate 中,是这样的:

  public void onCreate(SQLiteDatabase db) {
      db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " ("
           // Version 2:
           + Notes._ID + " INTEGER PRIMARY KEY,"
           + Notes.TITLE + " TEXT,"
           + Notes.NOTE + " TEXT,"
           + Notes.CREATED_DATE + " INTEGER,"
           + Notes.MODIFIED_DATE + " INTEGER,"
           // Version 3:
           + Notes.TAGS + " TEXT,"
           + Notes.ENCRYPTED + " INTEGER,"
           + Notes.THEME + " TEXT,"
           // Version 4:
           + Notes.SELECTION_START + " INTEGER,"
           + Notes.SELECTION_END + " INTEGER,"
           + Notes.SCROLL_POSITION + " REAL"
           + ");");
          }

现在我想要一个没有添加列的新数据库版本,但我只想更改表中某些字段的类型。我怎样才能做到这一点?

这里说http://sqlite.org/lang_altertable.html是不可能改变字段类型的。我该如何规避这个问题?

我以这种方式在数据库中插入数据:

   ContentValues v = new ContentValues();
   v.put("field1", myString); // fileld1 in db is defined as integer

   dbManager.updateTable("mytable", v, whereClause);

在这种情况下如何进行 CAST?

4

1 回答 1

11

SQLite 确实不允许更改现有的表列。

但是,SQLite 使用动态类型,因此您在表定义中设置的列类型并不重要(由于类型关联而导致的转换除外)。

在一般情况下,对表(新列除外)的任何更改都需要您创建一个新表:

CREATE TABLE TempTable (...);
INSERT INTO TempTable SELECT col1, col2, ... FROM MyTable;
DROP TABLE MyTable;
ALTER TABLE TempTable RENAME TO MyTable;

如果要更改已存储在表中的值的类型,则必须使用CAST

...
INSERT INTO TempTable SELECT CAST(col1 AS TEXT), ... From MyTable;
...

对于新值,只需将具有正确类型的值放入ContentValues对象中。

于 2012-11-07T13:23:45.450 回答