2013-04-11 2 views
13

В первый раз задавая вопрос здесь, так что будьте осторожны, Lol.getDatabase, называемый рекурсивно

В любом случае. Я работал над Android, и моя последняя сборка работала безупречно. До вчерашнего дня, когда ИТ дал мне новую рабочую станцию. После получения этой новой рабочей станции, я получаю следующее сообщение об ошибке:

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

Если это поможет, я бегу это виртуальное устройство, с помощью платформы 4.2.2 и уровень API 17.

I я действительно надеюсь, что кто-то может пролить свет на эту ошибку, поэтому я могу прекратить вырывать мои волосы, Лол.

Если требуется какая-либо другая информация, пожалуйста, дайте мне знать.

Большое спасибо,

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

Ну код совсем не изменился, поэтому я думал, что это не актуально в данном конкретном случае. Сам проект также довольно большой и не совсем уверен, откуда эта ошибка. Полный логарифм добавлен в исходное сообщение. Вызванная строка утверждает то же самое, getDatabase называется рекурсивно. Опять же, единственное, что изменилось, это рабочая станция. Очень смутно. В любом случае, спасибо за очень быстрый ответ. –

+0

Хорошо ... Так что, видимо, я спал. После прочтения логарифма снова я заметил то, чего у меня не было раньше. Я признаю, что сейчас чувствую себя довольно глупо, чтобы опубликовать это. Во всяком случае, код, вызывающий эту ошибку, был добавлен в исходный пост. Все еще не уверен, почему это вызовет эту проблему, поэтому любая дополнительная помощь будет отличной. Еще раз спасибо. B. –

ответ

34

Попробуйте изменить метод setDefaultLabel() к ...

public void setDefaultLabel(SQLiteDatabase db) 

... потом в onCreate(...) просто передать параметр db в него и избавиться от этой линии ...

SQLiteDatabase db = this.getWritableDatabase(); 

Ваш код должен выглядеть следующим образом:

@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(...) передается ссылка на базу данных open/writeable, но затем вызывает setDefaultLabel(...), которая пытается получить другую доступную для записи ссылку на базу данных.

+0

Вау, большое вам спасибо. Я не могу поверить, что я пропустил это. Я думаю, что иногда спать - это хорошо, Лол.Во всяком случае, больше не получается ошибка, хотя она не совсем работает, как я надеялся. Была попытка создать запись по умолчанию, созданную при создании db. Придется вернуться к чертежной доске. Еще раз спасибо всем за помощь. –

+0

@BradBass: Ну, по крайней мере, это одна ошибка, которую вы сейчас понимаете и не должны беспокоиться. Рад помочь. Удачи и приятного времяпровождения. – Squonk

+0

Не игнорирует ли это метод getWriteableDatabase? Этот метод не нужен? – AlleyOOP

1

Вот мое решение для этого: В помощнике я отменяю 2 метод getWritableDatabase() и getReadableDatabase(), как показано ниже: Обратите внимание, что вы не должны закрыть базу данных, она может быть разбилось.

@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

Смежные вопросы