2017-09-01 9 views
0
public void addcolumn(String year,String period){ 


    //Create column name here 

    Calendar now = Calendar.getInstance(); 
    int yeara = now.get(Calendar.YEAR); 
    int month = now.get(Calendar.MONTH) + 1; 
    int day = now.get(Calendar.DAY_OF_MONTH); 

    //select period according to current time 

    String colnew = ""+yeara+"_"+month+"_"+day+"_"+period; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String exec; 



    //Add column in table according to given year 
    // 

    if (year.equals("First Year")) { 
     exec="ALTER TABLE "+ table_name1+" ADD COLUMN "+colnew+" INTEGER NOT NULL DEFAULT 0"; 
     db.execSQL(exec); 

    } 
    else if (year.equals("Second Year")) { 
     db.execSQL("ALTER TABLE "+ table_name2+" ADD COLUMN "+colnew+" INTEGER NOT NULL DEFAULT 0"); 

    } 
    else if (year.equals("Third Year")) { 
     db.execSQL("ALTER TABLE "+ table_name3+" ADD COLUMN "+colnew+" INTEGER NOT NULL DEFAULT 0"); 

    } 
    else if (year.equals("Fourth Year")) { 
     db.execSQL("ALTER TABLE "+ table_name4+" ADD COLUMN "+colnew+" INTEGER NOT NULL DEFAULT 0"); 

    } 


} 

を使用して、データベースの既存のテーブルに列を追加したいしかし、私はaddcolumn()方法私のアプリがクラッシュを使用して列を追加しようとします。 コードに問題がある場合は、修正してください。私が見ることができるは、私は次のような方法

+1

「私のアプリがクラッシュした」 - あなたのLogCat出力 – Droidman

+0

LogCat出力を投稿してください?? –

+0

私がコメントした後にコードを実行した場合: –

答えて

1

1つの明らかな誤りは、あなたのヘルパークラスのONUPGRADE()メソッドの外にDBスキーマを変更しようとしているということです。

スキーマのみ)は、唯一のonCreate(内部で作成することができる方法に類似ONUPGRADE()メソッドの内部で変更することができます。

データベースのバージョンをアップグレードする必要があります。これにより、onUpgrade()コードが起動されます。それを処理する正しい方法は、視点によって異なります。データベース全体を切り捨てて、変更されたスキーマを持つonCreate()を呼び出すか、dbバージョンとスキーマを変更するケースを持つことができます。

詳細については、この答えをチェックアウト:

How to add new Column to Android SQLite Database?

+0

ヘルパークラスのonupgradeメソッド内で 'alter table' sqliteコマンドを使用する必要がありますか? –

+0

私はonupgrade()メソッドを呼び出す方法を教えてください。 –

+0

答えにリンクを指定しました。 onUpgrade()の例を見てください。また、onCreate()やonUpgrade()でalter文やDDLコマンドを使用する必要があります。 – Kushan

0

をあなたが例えばの線に沿ってという名前の列を追加しようとしていることが表示されますALTERステートメントはALTER TABLE youtablename ADD COLUMN 20170901 INTEGER NOT NULL DEFAULT 0のようになります。 SQLは、文字列とは対照的に、数値として数値を扱い、の線に沿って文句を言うだろうと

これは失敗になります: - あなたはALTER TABLE log ADD COLUMN '20170901' INTEGER NOT NULL DEFAULT 0を使用して文字列を示している可能性があり

SQLiteManager: Likely SQL syntax error: ALTER TABLE log ADD COLUMN 2020 INTEGER NOT NULL DEFAULT 0 [ near "2020": syntax error ] Exception Name: NS_ERROR_FAILURE Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement] 

(すなわち囲み単一引用符または二重引用符で囲まれた数字)。

代わりに、数字以外の接頭辞を使用することもできます。 ALTER TABLE youtablename ADD COLUMN Y20170901 INTEGER NOT NULL DEFAULT 0(つまり、数字部分の前にYが付いています)。

+0

他のクラスから 'onupgrade()'メソッドを意図的に呼び出すことはできますか? –

+0

dbhelperクラスの 'onupgrade()'メソッドを意味します。 –

+0

はい、理論的に、 'onUpgrade'は' onCreate'を呼び出すためによく使われます。しかし、私は、あなたが代わりの方法/方法論を使用しているかのように、あなたが望む/必要とすることを確信していません。 – MikeT

関連する問題