2011-12-07 3 views
5

私はAndroidで簡単なデータベースを作っています。私はコードが一度実行された後に新しいテーブルを追加したい。今、私は私のアプリケーションがクラッシュするEventDataSqlHelperクラスで私のonCreate()メソッドを変更しようとするたびに。アプリが1回実行された後に新しいテーブルをデータベースに追加する

これはおそらくSQLiteOpenHelperに関連付けられたonCreate()が、アプリが最初に実行されたときにのみ実行され、それ以降の変更はできないからです。

新しいテーブルを追加するための別の関数を書きました。それは完全に最初の実行で働いた。しかし2回目のexectionでは、前のデータベースを上書きするので、アプリケーションがクラッシュする。

データベースがすでに作成されている場合、データベースに新しいテーブルを追加する方法はありますか?

package org.example.sqldemo; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 
import android.util.Log; 

/** Helper to the database, manages versions and creation */ 
public class EventDataSQLHelper extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME = "events.db"; 
    private static final int DATABASE_VERSION = 1; 

    // Table name 
    public static final String TABLE = "events"; 

    // Columns 
    public static final String TIME = "time"; 
    public static final String TITLE = "title"; 

    public EventDataSQLHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String sql = "create table " + TABLE + "(" + BaseColumns._ID 
       + " integer primary key autoincrement, " + TIME + " integer, " 
       + TITLE + " text not null);"; 
     Log.d("EventsData", "onCreate: " + sql); 
     db.execSQL(sql); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 


    } 


} 

答えて

8

これはonUpgradeDATABASE_VERSIONが対象です。

例:

  • あなたがテーブルeventsを持っており、携帯電話上で実行されます。
  • 今度は、新しいテーブルusersが必要です。

    1. 変更DATABASE_VERSION = 2;(これはバージョン番号です)onCreate()
    2. 、(バージョンoldVersionNEWVERSIONの間で変更されたすべてのテーブルを作成し、すべてのテーブル(create table events & create table usersonUpgrade()
    3. 作成create table users
  • その後あなたは、新しいテーブルを追加し、再びDATABASE_VERSIONをインクリメントし、onCreateですべてのテーブルを作成し、すでにここに解決onUpgrade

2

CREATE TABLE IF NOT EXISTS TABLENAME ...をクエリとして使用すると、既存のテーブルは上書きされません。

関連する問題