2012-03-21 15 views
3

私はデータベースexamguideを持っており、既に1つのテーブルを作成していますtable_subject今は
このデータベースには2番目のテーブル(table_chapter)を作成します。私の質問は、既存のデータベースにこのテーブルを追加する方法です。私は次のコードを持っています。どんな助けもありがたい。sqliteのデータベースに2番目のテーブルを追加するには?

private static final String DATABASE_CREATE = "create table IF NOT EXISTS " 
     + TABLE_SUBJECT + "(" + COLUMN_ID 
     + " integer primary key autoincrement, " 
     + COLUMN_SUBJECT + " text not null, " 
     + COLUMN_CHAPTER + " text, " 
     + COLUMN_QUESTION + " text not null," 
     + COLUMN_OPTIONA + " text not null," 
     + COLUMN_OPTIONB + " text not null," 
     + COLUMN_OPTIONC + " text not null," 
     + COLUMN_OPTIOND + " text not null," 
     + COLUMN_CORRECT + " text not null," 
     + COLUMN_CONFIRM + " text not null);"; 

    private static final String DATABASE_CREATE1 = "create table IF NOT EXISTS " 
    + TABLE_CHAPTER + "(" + COLUMN_ID 
    + " integer primary key autoincrement, " 
    + COLUMN_SUBJECT + " text not null, " 
    + COLUMN_CHAPTER + " text, " 
    + COLUMN_QUESTION + " text not null," 
    + COLUMN_OPTIONA + " text not null," 
    + COLUMN_OPTIONB + " text not null," 
    + COLUMN_OPTIONC + " text not null," 
    + COLUMN_OPTIOND + " text not null," 
    + COLUMN_CORRECT + " text not null," 
    + COLUMN_CONFIRM + " text not null);"; 

public MySQLiteHelper open() throws SQLException 
{ 
    db = this.getWritableDatabase(); 
    return this; 
} 

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

} 


@Override 
public void onCreate(SQLiteDatabase database) { 

    database.execSQL(DATABASE_CREATE); 
    database.execSQL(DATABASE_CREATE1); 

} 

このコードは2番目のテーブルを作成しません。私は両方のテーブルをデータベースに入れたい。
logcatに次のエラーが表示されます。

03-21 18:31:06.551: ERROR/Database(8255): Error inserting chapter=paging correctoption=shadow copy craete a duplicate copy of page subject=operating system question=what is shadow copy? optiona=shadow copy craete a duplicate copy of page confirm=YES optionb=sahdow copy create paging optionc=shadow copy delete duplicate page optiond=shadow copy delete original and create shadow copy 
03-21 18:31:06.551: ERROR/Database(8255): android.database.sqlite.SQLiteException: no such table: chapter: , while compiling: INSERT INTO chapter(chapter, correctoption, subject, question, optiona, confirm, optionb, optionc, optiond) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?); 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426) 
03-21 18:31:06.551: ERROR/Database(8255):  at com.example.examguide.MySQLiteHelper.insertChapterData(MySQLiteHelper.java:212) 
03-21 18:31:06.551: ERROR/Database(8255):  at com.example.examguide.ObjectiveAddActivity$2.onClick(ObjectiveAddActivity.java:155) 
+2

を次のように見えるかもしれまず、それはあなたがこの最初のテーブルのために書かれ、その後、別のテーブルを作成するためにあなたの学習を適用しているが何であるかを理解しています。どのようにして最初のテーブルで行ったことを書いても、別のテーブルで同じことをする方法がわからないのですか? –

+0

(1)2つのテーブルを持つデータベースを作成する方法、(2)最初のテーブルの内容を消去して2つ目のテーブルをデータベースに追加する方法を明確にしてください。 –

+0

私は既存のデータベースに2番目のテーブルを追加する必要があります。私はまた、私の最初のテーブルを維持したい –

答えて

9

CREATE TABLE文字列を作成して、あなたのonCreateに、もう一度execSQLを呼び出す:

database.execSQL(DATABASE_CREATE1); 
database.execSQL(DATABASE_CREATE2); 

編集

をごonUpgrade方法を変更し、既存のデータベースに別のテーブルを追加するには次のように。 onUpgradeは、データベースをアップグレードする必要があるときはいつでも呼び出されます。これを有効にするには、VERSION_NUMBER(クラスにプライベートインスタンス変数として含める)をインクリメントする必要があります。

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Create the string for the second table creation 
    db.executeSQL(DATABASE_CREATE_SECOND_TABLE); 
} 

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.executeSQL(DATABASE_CREATE2); 
} 
+0

また、これはあなたが当初求めていたものなのかどうか分かりませんが、既存のデータを消去してテーブルを追加したい場合は、次のように 'onUpgrade'にテーブルを追加する必要があります。スルキアン。上記のコードは、データベースが最初に初期化されたときにデータベースに2つのテーブルを作成します。 –

+0

ありがとうございます! –

3

あなたがMySqliteHelperonUpgrade()方法を使用し、既存のデータベースにテーブルを追加したい場合は、複数のテーブル

private static final String ALERT_DATABASE="alerts.db"; 

//Database Version of Alert System 
private static final int ALERT_DATABASE_VERSION=1; 

//Create alert_type table 
private static final String CREATE_ALERT_TYPE="CREATE TABLE " 
     +ALERT_TYPE+"("+ALERT_TYPE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," 
     +ALERT_TYPE_NAME+" TEXT,"+ALERT_TYPE_TONE+" VARCHAR)"; 


private static final String CREATE_ALERT_INFORMATION="CREATE TABLE " 
     +ALERT_INFO+"("+ALERT_INFO_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," 
     +ALERT_INFO_TITLE+" TEXT," 
     +ALERT_INFO_DATE+" VARCHAR," 
     +ALERT_INFO_TIME+" VARCHAR," 
     +ALERT_INFO_DESCRIPTION+" VARCHAR," 
     +ALERT_INFO_TYPE_ID+" VARCHAR)"; 


public AlertDatabase(Context context) { 
    super(context, ALERT_DATABASE, null, ALERT_DATABASE_VERSION); 
    // TODO Auto-generated constructor stub 
} 
@Override 
public void onCreate(SQLiteDatabase alertdatabase){ 
    alertdatabase.execSQL(CREATE_ALERT_TYPE); 
    alertdatabase.execSQL(CREATE_ALERT_INFORMATION); 
} 
6

を作成することができ、このコードを使用しますMySqliteHelperコンストラクタに渡すデータベースバージョンの値をインクリメントします(1を渡して2を渡す場合)。

+0

ありがとうございます! –

3

既存のデータベースにテーブルを追加する場合は、次の操作を行う必要があります。 ヘルパークラスを使用しています。つまり、超伝導体では、バージョン番号を解析しています。このヘルパーオブジェクトの最初の作成時には、onCreateメソッドを呼び出して初期テーブルを作成します。バージョン番号を変更しない限り、クラスの新しいインスタンスを作成するときに関数は呼び出されません。しかし、ヘルパーにはonUpgradeメソッドも含まれています。この関数は、スーパーコンストラクタで解析したバージョン番号が以前使用していたバージョン番号よりも高い場合にのみ呼び出されます。だから何をする必要があります:

  1. 定数を増やすDATABASE-VERSION
  2. onUpgrade関数をオーバーライドし、あなたはデータベースが作成されたときにのみ呼ばれるように第2のテーブルを作成するために、onCreate()メソッドを使用することはできません
1

DB.execsql(yourtablecreationstring)の内側に追加します。 onUpgrade()を使用するか、これを行うための新しい方法を作成できます。オンアップグレードの使用には、versionが変更されたときに呼び出されるため、いくつかの制限があります。

だから、最良の方法は、あなたのヘルパークラスの新しいメソッドを追加することです。

方法は、あなたがする必要がどのような、

public void AddnewTable(){ 
    //At first you will need a Database object.Lets create it. 
    SQLiteDatabase ourDatabase=this.getWritableDatabase(); 

    ourDatabase.execSQL(CreateTableString)//CreateTableString is the SQL Command String   
    } 
関連する問題