2011-10-01 12 views
27

データを保持し、列を追加します。SQLiteは私が4列のデータベースを持っている

@Override 
public void onCreate(SQLiteDatabase database) { 
     database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT);"); 
} 

は今、私は別の列を追加したいが、データベースに既に存在する行を保ちます。私はこれをどのようにするべきですか?私はこれに対する有用な言及を見つけることができません。

@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
    //What to do here? 
} 

私は私のonCreateを変更したEDIT

@Override 
public void onCreate(SQLiteDatabase database) { 
    database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT);"); 
} 

と私のONUPGRADE:

@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
    Logger.log("Updating userstations database from " + arg1 + " to " + arg2 + "."); 
    if (arg1 == 2 && arg2 == 3) { 
     db.execSQL("ALTER TABLE " + DATABASENAME + " ADD COLUMN code TEXT;"); 
    } else if(arg1 == 1){ 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASENAME); 
    } 
    onCreate(db); 
} 

はしかし、今、私はこのスタックトレースを取得する:

10-01 21:24:19.581: ERROR/Database(21434): Failure 1 (table userstations already exists) on 0x19c378 when preparing 'CREATE TABLE userstations (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT);'. 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434): Couldn't open userstations for writing (will try read-only): 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434): android.database.sqlite.SQLiteException: table userstations already exists: CREATE TABLE userstations (name TEXT, latitude REAL, longitude REAL, country TEXT, code TEXT); 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.databases.UserStationsOpenHelper.onCreate(UserStationsOpenHelper.java:25) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.databases.UserStationsOpenHelper.onUpgrade(UserStationsOpenHelper.java:36) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.databases.UserStationsOpenHelper.getStations(UserStationsOpenHelper.java:43) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.Data.readUserStations(Data.java:369) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.Data.getUserStations(Data.java:210) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.stationstab.StationsActivity.newStations(StationsActivity.java:190) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.stationstab.StationsActivity.refresh(StationsActivity.java:129) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.stationstab.StationsActivity.onCreate(StationsActivity.java:108) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.stationstab.StationsActivityGroup.onCreate(StationsActivityGroup.java:38) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.widget.TabHost.addTab(TabHost.java:216) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.TreinVerkeer.setupTab(TreinVerkeer.java:131) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.TreinVerkeer.initTabs(TreinVerkeer.java:108) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.myapp.myapp.TreinVerkeer.onCreate(TreinVerkeer.java:62) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.os.Looper.loop(Looper.java:123) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
10-01 21:24:19.611: ERROR/SQLiteOpenHelper(21434):  at dalvik.system.NativeStart.main(Native Method) 
10-01 21:24:19.621: DEBUG/AndroidRuntime(21434): Shutting down VM 
10-01 21:24:19.621: WARN/dalvikvm(21434): threadid=1: thread exiting with uncaught exception (group=0x4018a560) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434): FATAL EXCEPTION: main 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.TreinVerkeer}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivityGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.os.Looper.loop(Looper.java:123) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at dalvik.system.NativeStart.main(Native Method) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivityGroup}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.widget.TabHost.addTab(TabHost.java:216) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp.TreinVerkeer.setupTab(TreinVerkeer.java:131) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp.TreinVerkeer.initTabs(TreinVerkeer.java:108) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp.TreinVerkeer.onCreate(TreinVerkeer.java:62) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  ... 11 more 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myapp/com.myapp.myapp.stationstab.StationsActivity}: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp.stationstab.StationsActivityGroup.onCreate(StationsActivityGroup.java:38) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  ... 22 more 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 2 to 3: /data/data/com.myapp.myapp/databases/userstations 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:199) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp.databases.UserStationsOpenHelper.getStations(UserStationsOpenHelper.java:43) 
10-01 21:24:19.641: ERROR/AndroidRuntime(21434):  at com.myapp.myapp 

答えて

48

がテーブルの上に新しい列を作成するための構文についてはthisのページをご覧ください。基本的には、次のとおりです。

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    String upgradeQuery = "ALTER TABLE mytable ADD COLUMN mycolumn TEXT"; 
    if (oldVersion == 1 && newVersion == 2) 
     db.execSQL(upgradeQuery); 
} 
+0

私の編集 – nhaarman

+1

を参照してください。なぜ、後でonCreate()を呼び出していますか?アップグレードは、onCreate()がすでに呼び出されていることを意味します(テーブル/ dbがすでに作成されていることを意味します)。この問題は、例外で詳しく説明されています(onCreate()の行番号〜25行目まで)。すでに存在する表を作成しようとしています。 – Jack

+0

ああ、大丈夫です。しかし、バージョン1からアップデート後にdbを削除する行があるので、onCreateを呼び出す必要はありますか? – nhaarman

2

私はアンドロイドで働いていませんが、SQLiteは、ほとんどのSQLの実装として「テーブルを変更」を提供します:

SQLite alter table

+0

ALTER TABLE MyTable ADD COLUMN MyNewCol TEXT; –

6

より良いアプローチ

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    switch (oldVersion) { 
     case 1: 
      db.execSQL(SQL_MY_TABLE); 


     case 2: 
      db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT"); 

    } 
} 

は、アップグレード、ケース1で言うことができます:あなたのONUPGRADE方法で

ALTER TABLE mytable ADD COLUMN mycolumn TEXT 

、それは次のようになりますdbバージョン2に変更しました。新しいテーブルを作成しましたが、ケース2で表示されるmyNewColumnを忘れました。これは、dbバージョンを3に変更すると、ケース2が2から3へのアップグレード。

+0

バージョン3では第2のクエリは冗長であり、冗長ではありません。 case3のクエリー –

+0

これはonUpgradeで、古いバージョンがバージョン2のときに新しいバージョンがバージョン3になり、コードが実行されるときを示しています – Codeversed

+2

このコードでわかる唯一の問題は、 switch文からすべてのブレークを削除してください(すべてのケースが昇順であることを確認してください)。これにより、oldVersionの場合のすべてのケースも実行されます。 – TheIT