递归调用了getWritableDatabase/getReadableDatabase



更新

当我尝试从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

结束更新

我在这里发布问题之前已经搜索过了,但没有解决我的问题,所以最终发布了我的问题。。。

我正试图在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();
        } 
}

发生的情况是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(),您将得到一个null指针异常。

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()的递归调用。

由于您在onCreate中使用此方法,并且没有传入任何参数,因此您可能需要创建一个私有方法来执行此操作,并传入SQLiteDatabase参数,因此始终使用相同的数据库变量。

由于您使用的是this.getWriteableDatabase(),我预计它可能指向相同的数据库属性,而您多次调用它的事实可能是您的问题。我认为这是一个设计问题,这就是为什么我建议我这样做。

更新:

要修复NPE,只需使用以下内容:

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

相关内容

  • 没有找到相关文章

最新更新