getWritableDatabase / getReadableDatabase вызывается рекурсивно - PullRequest
2 голосов
/ 26 марта 2012

Обновление

получение ошибки при попытке вызвать метод из Activity:

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

КОНЕЦ ОБНОВЛЕНИЯ

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

iя пытаюсь вставить несколько строк в класс 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();
        } 
}

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

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

Простое исправление - это отправить db в качестве параметра 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();
        } 
}

ОТВЕТ НА ОБНОВЛЕНИЕ: Вы получаете исключение нулевого указателя, потому что отправляете null в 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 голосов
/ 26 марта 2012

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

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

ОБНОВЛЕНИЕ:

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

SQLiteDatabase db = this.getReadableDatabase();;
List<Album> r = dbHelper.getAllAlbum(db);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...