2012-02-05 13 views
6

と呼ば:getWritableDatabaseは、私は次のコードで私のデータベーステーブルを更新しようとしてる再帰的

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

     String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
     dbHelper.getWritableDatabase().rawQuery(query, null); 

    } 

しかし、私は、アプリケーションを起動し、それは私が次の例外を取得するデータベースのアップグレードしようとしたとき:

...Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively 

誰もがこの問題を回避する方法を知っていますか、それを正確に引き起こしているのは誰ですか?

おかげ

+0

これはコードのこの部分が呼び出される唯一の場所ではありませんか? – JoxTraex

+0

はい、これはコードが呼び出される唯一の場所です。私は関数にもlog文を入れて、一度だけ呼び出されます。 – Nick

+0

その後、古いバージョンが<新しいバージョンであるかどうかをチェックします。なぜ新しいバージョンであるのかはわかりませんが、複数回呼び出されているのはわかりません。 – JoxTraex

答えて

23

getWritableDatabase()を呼び出さないでください。渡されたものを使用してください:

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

    String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
    db.rawQuery(query, null); 

} 

なぜですか? getWritableDatabase()に電話すると、OpenHelperはデータベースを更新する必要があることを検出しているため、表示されている再帰警告を起動します。つまり、あなたはonUpgrade()です。 getWritableDatabase()に電話すると、アップグレードが必要と判断されます。小切手ではなかったのですが、onUpgrade()、広告無限に戻ります。

+0

偉大な答えは、@ブライアンデュプイ+1完全に逃した – JoxTraex

+0

木の森:)。ありがとう。 –

+0

パーフェクト、ありがとう! – Nick

関連する問題