2012-03-26 94 views
2

更新getWritableDatabase/getReadableDatabase递归调用

得到错误,当我尝试调用从活动的方法:

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

我HAE一个名为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 2012-03-26 18:32:45

回答

4

什么情况是,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(); 
     } 
} 

回应更新:你得到一个空指针异常东阳您发送空到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

我已更新我的问题,请看看 – 2012-03-26 15:00:40

0

因为你在你的onCreate利用这一点,你不能传递任何参数,你可能想使一个私有方法来做到这一点,并通过在SQLiteDatabase参数,所以你总是使用相同的数据库变量。

由于您使用的是this.getWriteableDatabase()我期望它可能指向相同的数据库属性,并且您多次调用它的事实可能是您的问题。我认为这是一个设计问题,这就是为什么我提出了我所做的修复。

UPDATE:

要解决的NPE只是用这样的:

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

你能告诉我你在说什么吗? – 2012-03-26 18:04:52

+0

另一个答案解释得很好,但我指出你为什么得到一个NPE。 – 2012-03-27 01:24:08