getWritableDatabase / getReadableDatabase递归调用 [英] getWritableDatabase/getReadableDatabase called recursively

查看:180
本文介绍了getWritableDatabase / getReadableDatabase递归调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新

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

  SQLiteDatabase DB = NULL;
清单<相册和GT; R = dbHelper.getAllAlbum(DB);

在我的dbHelper我HAE一个名为getAllAlbum方法

  //获取所有联系人
公开名单<相册和GT; getAllAlbum(SQLiteDatabase DB){
清单<相册和GT; REC =新的ArrayList<相册和GT;();
//选择所有查询
字符串selectQuery =SELECT * FROM+ KEY_TABLE;光标光标= db.rawQuery(selectQuery,NULL);//通过所有行循环,并增加列表
如果(cursor.moveToFirst()){
做{
    专辑R =新专辑();
    r.setID(的Integer.parseInt(cursor.getString(0)));
    r.setAlbumID(cursor.getString(1));
      ...............
      ...............
    rec.add(R);
}而(cursor.moveToNext());
}
//返回联系人列表
返回REC;
}03-25 20:12:48.995:E / AndroidRuntime(27297):致命异常:主要
03-25 20:12:48.995:E / AndroidRuntime(27297):了java.lang.RuntimeException:无法启动活动ComponentInfo {} net.website.Media_Player_Activity:显示java.lang.NullPointerException
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.os.Handler.dispatchMessage(Handler.java:99)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.os.Looper.loop(Looper.java:123)
03-25 20:12:48.995:E / AndroidRuntime(27297):在android.app.ActivityThread.main(ActivityThread.java:3683)
03-25 20:12:48.995:E / AndroidRuntime(27297):在java.lang.reflect.Method.invokeNative(本机方法)
03-25 20:12:48.995:E / AndroidRuntime(27297):在java.lang.reflect.Method.invoke(Method.java:507)
03-25 20:12:48.995:E / AndroidRuntime(27297):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
03-25 20:12:48.995:E / AndroidRuntime(27297):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-25 20:12:48.995:E / AndroidRuntime(27297):在dalvik.system.NativeStart.main(本机方法)
03-25 20:12:48.995:E / AndroidRuntime(27297):致:显示java.lang.NullPointerException

END更新

我已搜查前,我在这里发表这个问题,但并没有解决我的问题,所以最终发布我的问题...

我试图在提供SQLHelper类中插入几行,当我得到下面的错误...

logcat的:

  5月3日至25日:34:06.725:E / AndroidRuntime(17465):了java.lang.RuntimeException:无法启动活动ComponentInfo {} net.website.Media_Player_Activity:java.lang中.IllegalStateException:getWritableDatabase递归调用
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.os.Handler.dispatchMessage(Handler.java:99)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.os.Looper.loop(Looper.java:123)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread.main(ActivityThread.java:3683)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在java.lang.reflect.Method.invokeNative(本机方法)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在java.lang.reflect.Method.invoke(Method.java:507)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在dalvik.system.NativeStart.main(本机方法)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):java.lang.IllegalStateException:致getWritableDatabase递归调用
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:101)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在net.issoa.db.DatabaseHelper.getReciterCount1(DatabaseHelper.java:120)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在net.issoa.db.DatabaseHelper.onCreate(DatabaseHelper.java:80)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在net.issoa.db.DatabaseHelper.getAllReciterObj(DatabaseHelper.java:144)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在net.issoa.Media_Player_Activity.doInBackground(Media_Player_Activity.java:535)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在net.issoa.Media_Player_Activity.onCreate(Media_Player_Activity.java:106)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
5月3日至25日:34:06.725:E / AndroidRuntime(17465):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)公共类DatabaseHelper扩展SQLiteOpenHelper {公共DatabaseHelper(上下文的背景下){
        超(背景下,KEY_DB_N​​AME,空,KEY_DATABASE_VERSION);
    }@覆盖
    公共无效的onCreate(SQLiteDatabase DB){        db.execSQL(CREATE TABLE+ KEY_TABLE +(+
                KEY_ID +INTEGER PRIMARY KEY,+
                KEY_ALBUM_ID +TEXT+
                ););
        //插入pre定义的部门
        如果(getAlbumCount()== 0)
        {
            InsertAlbum();
        }
    }    INT getAlbumCount()
    {
        SQLiteDatabase分贝= this.getReadableDatabase();
        光标CUR = db.rawQuery(选择*+ KEY_TABLE,NULL);
        INT X = cur.getCount();
        cur.close();
        返回X;
    }        无效InsertAlbum()
    {
         ContentValues​​ CV =新ContentValues​​();
             cv.put(KEY_ALBUM_ID,KEY_ALBUM_ID_VALUE);
             ................
             SQLiteDatabase分贝= this.getWritableDatabase();
        db.insert(KEY_TABLE,空,CV);
        db.close();
        }
}


解决方案

什么情况是,getReadableDatabase()调用的onCreate()调用至极至极getAlbumCount调用getReadableDatabase()调用至极的onCreate()...你可以看到这是去。

最简单的解决方法是发送DB作为参数传递给getAlbumCount()这样的

 公共类DatabaseHelper扩展SQLiteOpenHelper {公共DatabaseHelper(上下文的背景下){
        超(背景下,KEY_DB_N​​AME,空,KEY_DATABASE_VERSION);
    }@覆盖
    公共无效的onCreate(SQLiteDatabase DB){        db.execSQL(CREATE TABLE+ KEY_TABLE +(+
                KEY_ID +INTEGER PRIMARY KEY,+
                KEY_ALBUM_ID +TEXT+
                ););
        //插入pre定义的部门
        如果(getAlbumCount(DB)== 0)
        {
            InsertAlbum(DB);
        }
    }    INT getAlbumCount(SQLiteDatabase DB)
    {        光标CUR = db.rawQuery(选择*+ KEY_TABLE,NULL);
        INT X = cur.getCount();
        cur.close();
        返回X;
    }        无效InsertAlbum(SQLiteDatabase DB)
    {
         ContentValues​​ CV =新ContentValues​​();
             cv.put(KEY_ALBUM_ID,KEY_ALBUM_ID_VALUE);
             ................        db.insert(KEY_TABLE,空,CV);
        db.close();
        }
}

响应时间:您得到一个空指针异常东阳你发送空到getAllAlbum()。

  SQLiteDatabase DB = dbHelper.getWritableDatabse(DB);
清单<相册和GT; R = dbHelper.getAllAlbum(DB);

一个非常巧妙的解决方法是重载这样的getAllAlbum()方法。

 公共类DatabaseHelper扩展SQLiteOpenHelper {     公开名单<相册和GT; getAllAlbum(){
     //永远不会调用此方法从内部的onCreate()
     返回getAllAblum(this.getWritableDatabase());
     }     私人列表<相册和GT; getAllAlbum(SQLiteDatabase DB){
     //得到的结果在这里
     //只能从类中调用这个方法
     }}

如果您需要外部和内部访问可以APLY这个到previous方法为好。
这样,你可以只调用getAllAlbum()从外面没有任何参数,避免递归调用的onCreate()。

Update

getting error when i try to call the method from Activity:

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

in my dbHelper i hae a method called 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

i have searched before i post the question here but does not fix my problem so end up posting my question...

i am trying to insert few rows in sqlhelper class and when i get the below error...

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();
        } 
}

解决方案

What happens is that getReadableDatabase() calls onCreate() wich calls getAlbumCount wich calls getReadableDatabase() wich calls onCreate() ... you can see where this is going.

The easy fix is send db as a parameter to getAlbumCount() like this

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();
        } 
}

RESPONSE TO UPDATE: You are getting a null pointer exception beacause you are sending null to getAllAlbum().

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

A much neater solution is to overload the getAllAlbum() method like this.

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
     }

}

You can aply this to the previous methods as well if you need both outside and inside access. This way you could just call getAllAlbum() with no parameters from the outside and avoid recursive calls to onCreate().

这篇关于getWritableDatabase / getReadableDatabase递归调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆