2011-03-04 11 views
9

私のアプリケーションのSQLite DBにテーブルを追加しています。すべての私の構文は問題ではなく、問題ありません。しかし、新しいテーブルを適切に作成するのにはいくつか問題があります。新しいテーブルを追加しました....SQLiteデータベースを更新し、既存のデータをすべて失うことはありませんか?

@Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(DATABASE_CREATE); 
      db.execSQL(CREATE_REQUESTS); 
      db.execSQL(CREATE_OVERRIDE); 
     } 

My on createメソッド。私は3つのテーブルを持っています。バージョン番号を更新すると、「テーブル要求(CREATE_REQUESTSを参照する)がすでに作成されています」というエラーが表示されました。私ONUPGRADE方法を見て...

@Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS contacts"); 
      onCreate(db); 
     } 

は、次の行、その後、のonCreateメソッドで私のDATABASE_CREATEテーブルを参照ラインdb.execSQL("DROP TABLE IF EXISTS contacts")は、古いテーブルを削除するために使用されていることを理解するために私を導いたonCreate(db);それを再現する。そのexecSQL行にリクエストを追加しなかったため、エラーが発生しました。ここに問題があります:私はすでに持っている2つのテーブルのデータを失うことはありません。私がやろうとしているようにテーブルを追加する方法はありますか?古いデータをすべて失うことはありませんか?ありがとう。

答えて

12

onUpgradeで何でもできます。 ALTERを使用して新しい列をテーブルに追加することができます。

最悪の場合、スキーマが完全に完全に異なる場合は、新しいテーブルを作成し、古いテーブルのデータを使用してそれを設定し、古いテーブルを削除する必要があります。

いずれにしても、データを失うことなく円滑にアップグレードできるように、onUpgradeが設計されています。正しく実装するのはあなた次第です。

+0

フムのために正常に動作します後

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE " + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;"; 

。あなたがonUpgradeでそれをした場合、誰かがゼロからアプリケーションを使用するときには作成されないだろうが、私はonCreateメソッドにそれを置く限り、大きな問題ではないと私の懸念があると思う。ありがとう! – JMRboosties

+0

onUpgradeは、既存のアプリがアップグレードされた場合にのみ呼び出されます。最初からアプリを起動すると、onCreateだけが呼び出されます。 – EboMike

+4

データベースバージョンをインクリメントするときにのみ呼び出されます。 –

0

DBバージョン場合:あなたがにアップグレードすると6

Ex : There is a table with 5 columns 

: "DATABASE_ALTER_ADD_PAPER_PAID":7

1. We need to add the columns when creating a table 

2. onUpgrade method: 

if (oldVersion < 7) 
{ 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID); 
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED); 
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
} 

(私は3つのテーブルで1新しい列を追加しています)クエリです。上記の2つの動作、それはOK、新鮮なインストールユーザーとアプリのアップグレードユーザー

関連する問題