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 に答える