2012-03-26 3 views
2

UpdategetWritableDatabase/getReadableDatabase называется рекурсивно

получаю ошибку, когда я пытаюсь вызвать метод из деятельности:

SQLiteDatabase db = null; 
List<Album> r = dbHelper.getAllAlbum(db); 

в моем dbHelper я Хэ метод, называемый getAllAlbum

// Getting All Contacts 
public List<Album> getAllAlbum(SQLiteDatabase db) { 
List<Album> rec = new ArrayList<Album>(); 
// Select All Query 
String selectQuery = "SELECT * FROM " + KEY_TABLE; 

Cursor cursor = db.rawQuery(selectQuery, null); 

// looping through all rows and adding to list 
if (cursor.moveToFirst()) { 
do { 
    Album r = new Album(); 
    r.setID(Integer.parseInt(cursor.getString(0))); 
    r.setAlbumID(cursor.getString(1)); 
     ............... 
     ............... 
    rec.add(r); 
} while (cursor.moveToNext()); 
} 
// return contact list 
return rec; 
} 

03-25 20:12:48.995: E/AndroidRuntime(27297): FATAL EXCEPTION: main 
03-25 20:12:48.995: E/AndroidRuntime(27297): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.website.Media_Player_Activity}: java.lang.NullPointerException 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.os.Looper.loop(Looper.java:123) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at java.lang.reflect.Method.invokeNative(Native Method) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at java.lang.reflect.Method.invoke(Method.java:507) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-25 20:12:48.995: E/AndroidRuntime(27297): at dalvik.system.NativeStart.main(Native Method) 
03-25 20:12:48.995: E/AndroidRuntime(27297): Caused by: java.lang.NullPointerException 

END UPDATE

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

я пытаюсь вставить несколько строк в классе sqlhelper и когда я получаю ошибку ниже .. .

LogCat:

03-25 05:34:06.725: E/AndroidRuntime(17465): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.website.Media_Player_Activity}: java.lang.IllegalStateException: getWritableDatabase called recursively 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.os.Looper.loop(Looper.java:123) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at java.lang.reflect.Method.invokeNative(Native Method) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at java.lang.reflect.Method.invoke(Method.java:507) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at dalvik.system.NativeStart.main(Native Method) 
03-25 05:34:06.725: E/AndroidRuntime(17465): Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:101) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at net.issoa.db.DatabaseHelper.getReciterCount1(DatabaseHelper.java:120) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at net.issoa.db.DatabaseHelper.onCreate(DatabaseHelper.java:80) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at net.issoa.db.DatabaseHelper.getAllReciterObj(DatabaseHelper.java:144) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at net.issoa.Media_Player_Activity.doInBackground(Media_Player_Activity.java:535) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at net.issoa.Media_Player_Activity.onCreate(Media_Player_Activity.java:106) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
03-25 05:34:06.725: E/AndroidRuntime(17465): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 



public class DatabaseHelper extends SQLiteOpenHelper { 

public DatabaseHelper(Context context) { 
     super(context, KEY_DB_NAME, null, KEY_DATABASE_VERSION); 
    } 

@Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL("CREATE TABLE " + KEY_TABLE + "(" + 
       KEY_ID + " INTEGER PRIMARY KEY, " + 
       KEY_ALBUM_ID + " TEXT, " + 
       ");"); 
     //Inserts pre-defined departments 
     if (getAlbumCount() == 0) 
     { 
      InsertAlbum(); 
     } 
    } 

    int getAlbumCount() 
    { 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Cursor cur= db.rawQuery("Select * from "+ KEY_TABLE, null); 
     int x= cur.getCount(); 
     cur.close(); 
     return x; 
    } 

     void InsertAlbum() 
    { 
     ContentValues cv = new ContentValues(); 
      cv.put(KEY_ALBUM_ID, KEY_ALBUM_ID_VALUE); 
      ................ 
      SQLiteDatabase db = this.getWritableDatabase(); 
     db.insert(KEY_TABLE, null, cv); 
     db.close(); 
     } 
} 
+0

Ваши первые две строки кода должны быть: SQLiteDatabase db = DatabaseHelper.getWritableDatabase(); Список r = dbHelper.getAllAlbum (db); – bughi

ответ

4

Что происходит, что getReadableDatabase() вызывает OnCreate() которым называет getAlbumCount которым называет getReadableDatabase() которым называет OnCreate () ... вы можете видеть, где это происходит.

Простое исправление отправить дб в качестве параметра getAlbumCount() как этого

public class DatabaseHelper extends SQLiteOpenHelper { 

public DatabaseHelper(Context context) { 
     super(context, KEY_DB_NAME, null, KEY_DATABASE_VERSION); 
    } 

@Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL("CREATE TABLE " + KEY_TABLE + "(" + 
       KEY_ID + " INTEGER PRIMARY KEY, " + 
       KEY_ALBUM_ID + " TEXT, " + 
       ");"); 
     //Inserts pre-defined departments 
     if (getAlbumCount(db) == 0) 
     { 
      InsertAlbum(db); 
     } 
    } 

    int getAlbumCount(SQLiteDatabase db) 
    { 

     Cursor cur= db.rawQuery("Select * from "+ KEY_TABLE, null); 
     int x= cur.getCount(); 
     cur.close(); 
     return x; 
    } 

     void InsertAlbum(SQLiteDatabase db) 
    { 
     ContentValues cv = new ContentValues(); 
      cv.put(KEY_ALBUM_ID, KEY_ALBUM_ID_VALUE); 
      ................ 

     db.insert(KEY_TABLE, null, cv); 
     db.close(); 
     } 
} 

ОТВЕТ НА ОБНОВЛЕНИЕ: Вы получаете исключения нулевого указателя обусловленно вы отправляете в нуле getAllAlbum().

SQLiteDatabase db = dbHelper.getWritableDatabse(db); 
List<Album> r = dbHelper.getAllAlbum(db); 

Решение гораздо лучше, чем при перегрузке метода getAllAlbum().

public class DatabaseHelper extends SQLiteOpenHelper { 

    public List<Album> getAllAlbum() { 
    //never ever call this method from within onCreate() 
    return getAllAblum(this.getWritableDatabase()); 
    } 

    private List<Album> getAllAlbum(SQLiteDatabase db) { 
    // get results here 
    //only call this method from within the class 
    } 

} 

Вы можете применить это к предыдущим методам, если вам нужен как внешний, так и внутренний доступ. Таким образом, вы можете просто вызвать getAllAlbum() без параметров снаружи и избежать рекурсивных вызовов onCreate().

+0

Я обновил свой вопрос, пожалуйста, посмотрите –

0

Поскольку вы используете это в вашем onCreate и вы не переходящая в каких-либо параметров, вы можете захотеть сделать частный метод, чтобы сделать это, и передать в параметре SQLiteDatabase, поэтому вы всегда используете одну и ту же переменную базы данных.

Поскольку вы используете this.getWriteableDatabase() Я ожидаю, что он может указывать на то же свойство базы данных, и тот факт, что вы называете это более одного раза, вероятно, является вашей проблемой. Я думаю, что это проблема дизайна, поэтому я предложил исправить это.

UPDATE:

Чтобы исправить NPE просто использовать это:

SQLiteDatabase db = this.getReadableDatabase();; 
List<Album> r = dbHelper.getAllAlbum(db); 
+0

Можете ли вы показать мне, о чем вы говорите? –

+0

другой ответ объяснил это очень хорошо, но я указал, почему вы получаете NPE. –

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