2013-04-11 11 views
13

と呼ばれます。getDatabaseはそう笑、穏やかな、ここで質問をして私の最初の時間再帰的

とにかく。私はAndroidで作業していて、私の最新ビルドは完璧に走った。ITが私に新しいワークステーションをくれた昨日まで。それは、私がプラットフォーム4.2.2およびAPIレベル17

Iを使用して、仮想デバイスでこれを実行しているのに役立ちます場合は

04-11 17:34:53.282: E/AndroidRuntime(789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively

:この新しいワークステーションを取得するので、私は次のエラーを得続けます誰かがこのエラーで何らかの光を当てることができることを本当に望んでいるので、私は髪を切り取るのを止めることができます、笑。その他の情報が必要な場合は

、私に知らせてください。

ありがとうございました。

Brad。

EDIT:エラーの原因を追加しましたコード:logcat

04-11 19:25:08.668: E/AndroidRuntime(2748): FATAL EXCEPTION: main 
04-11 19:25:08.668: E/AndroidRuntime(2748): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.os.Looper.loop(Looper.java:137) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at dalvik.system.NativeStart.main(Native Method) 
04-11 19:25:08.668: E/AndroidRuntime(2748): Caused by: java.lang.IllegalStateException: getDatabase called recursively 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.setDefaultLabel(DatabaseHandler.java:90) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.onCreate(DatabaseHandler.java:82) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.populateFields(DatabaseHandler.java:196) 
04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.SettingsActivity.onCreate(SettingsActivity.java:45) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.Activity.performCreate(Activity.java:5104) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  ... 11 more 

EDITの多くを追加しました。 setDefaultLabel()が原因です。

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create tables   
    db.execSQL(CREATE_CATEGORIES_TABLE);   
    db.execSQL(CREATE_CHRGDATA_TABLE); 
    db.execSQL(CREATE_SETTINGS_TABLE); 
    setDefaultLabel(); 
} 

/** 
* 
*/ 

public void setDefaultLabel() { 
    // create default label 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, "Default"); 
    db.insert(TABLE_LABELS, null, values); 
} 
+2

原因となっているコードを表示せずにエラーを送信すると、誰でも手伝ってもらうことはできません。また、logcatには "Caused by ..."という行があるので、さらにポストしてください。 – Squonk

+0

まあコードはまったく変わっていないので、私はこの特定のケースでは、それは関係ありませんと思いました。プロジェクト自体もかなり大きく、このエラーがどこから来ているのか分からない。完全なlogcatが元の投稿に追加されました。 Caused by lineは同じことを述べています.getDatabaseは再帰的に呼び出されます。繰り返しますが、変更されたのはワークステーションだけです。非常に混乱します。とにかく、非常に迅速な返答に感謝します。 –

+0

[OK]を...だから明らかに私は眠っていた。..再びlogcatて読んだ後、私は病気が、私はこれを掲示するために今、非常に愚かな感じを認める..私が前にいなかった何かに気づきました。とにかく、このエラーの原因となったコードが元の投稿に追加されました。それがなぜこの問題を引き起こすのかまだ分からないので、追加の援助はすばらしくなるでしょう。再度、感謝します。 B. –

答えて

34

その後、onCreate(...)に単に...

SQLiteDatabase db = this.getWritableDatabase(); 
をそれに dbパラメータを渡すと、このラインを取り除く...

public void setDefaultLabel(SQLiteDatabase db) 

...あなたのsetDefaultLabel()方法にを変更してみてください

コードは次のようになります。

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create tables   
    db.execSQL(CREATE_CATEGORIES_TABLE);   
    db.execSQL(CREATE_CHRGDATA_TABLE); 
    db.execSQL(CREATE_SETTINGS_TABLE); 
    setDefaultLabel(db); 
} 

/** 
* 
*/ 

public void setDefaultLabel(SQLiteDatabase db) { 
    // create default label 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, "Default"); 
    db.insert(TABLE_LABELS, null, values); 
} 
既存のコードで

問題はonCreate(...)がオープン/書き込み可能なデータベースへの参照が渡されていることですが、それは、データベースへの別の書き込み可能な参照を取得しようとしsetDefaultLabel(...)を呼び出します。以下のようなヘルパーで 、私は2つの方法getWritableDatabase()をオーバーライドし、getReadableDatabase():ここで

+0

うわー、ありがとう。私はそれを逃したと信じていない。私は時には寝るのが良いことだと思う、笑。とにかく、もはや私が望んでいたように正確に動作していませんが、もはやエラーを取得していません。 dbが作成されたときに "デフォルト"レコードを作成しようとしていました。作図板に戻らなければならないでしょう。すべての助けをありがとう。 –

+0

@BradBass:あなたが今理解しているので、心配する必要はありません。喜んで助けてください。頑張って楽しんでね。 – Squonk

+0

これはgetWriteableDatabaseメソッドを全く無視していませんか?その方法は不要ですか? – AlleyOOP

1

このため私の解決策であるあなたは、データベースを閉じてはならないことに注意してください 、それがクラッシュすることができます。

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // All your code here ..... 

     // Add default value for all tables 
     isCreating = true; 
     currentDB = db; 
     generateAllDefaultData(); 
     // release var 
     isCreating = false; 
     currentDB = null; 
    } 

    boolean isCreating = false; 
    SQLiteDatabase currentDB = null; 

    @Override 
    public SQLiteDatabase getWritableDatabase() { 
     // TODO Auto-generated method stub 
     if(isCreating && currentDB != null){ 
      return currentDB; 
     } 
     return super.getWritableDatabase(); 
    } 

    @Override 
    public SQLiteDatabase getReadableDatabase() { 
     // TODO Auto-generated method stub 
     if(isCreating && currentDB != null){ 
      return currentDB; 
     } 
     return super.getReadableDatabase(); 
    } 
+0

java.lang.IllegalStateException:既に閉じられているオブジェクトを再オープンしようとしました: – Galya

関連する問題