java.lang.IllegalStateException:getWritableDatabase called recursively

我怕爱的太早我们不能终老 提交于 2019-12-23 17:47:05

问题


Please help me to rsolve the error :

D/AndroidRuntime(836): Shutting down VM
W/dalvikvm(836): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime(836): FATAL EXCEPTION: main
E/AndroidRuntime(836): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.FirstProject/com.example.FirstProject.List}: java.lang.IllegalStateException: getWritableDatabase called recursively
E/AndroidRuntime(836):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(836):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(836):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(836):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(836):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(836):  at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(836):  at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(836):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(836):  at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(836):  at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(836): Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively
E/AndroidRuntime(836):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:81)
E/AndroidRuntime(836):  at com.example.FirstProject.Database.onCreate(Database.java:36)
E/AndroidRuntime(836):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:106)
E/AndroidRuntime(836):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
E/AndroidRuntime(836):  at com.example.FirstProject.List.onCreate(List.java:38)
E/AndroidRuntime(836):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(836):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(836):  ... 11 more

code:

package com.example.FirstProject;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;



public class List extends ListActivity{
ListView stations;
protected int tn;
protected TextView source;
protected EditText searchText;
protected ListAdapter adapter;
protected Cursor cursor;


 @Override
    public void onCreate(Bundle savedInstanceState)throws IllegalStateException {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.screen2);

       tn = getIntent().getIntExtra("tn", 0);
       SQLiteDatabase db = (new Database(this)).getReadableDatabase();
      // searchText = (EditText) findViewById (android.R.id.list);
        stations = (ListView) findViewById (android.R.id.list);


        Cursor cursor = db.rawQuery("SELECT source._id,FROM tinfo WHERE city._id =     Mumbai", new String[]{});
        startManagingCursor(cursor);

        adapter = new SimpleCursorAdapter(this,  R.layout.screen2,  cursor, new     String[] {}, new int[] {});
        stations.setAdapter(adapter);

 }

}

回答1:


You probably call getWritableDatabase()(or getReadableDatabase()) in one of the methods onCreate() or onUpgrade() of your implementation of SQLiteOpenHelper. getWritableDatabase() calls onCreate(or onUpgrade) so if you have a getWritableDatabase() call in one of those methods you will run in trouble.

Those methods have a parameter (a SQLiteDatabase object) that you must use to do your database logic(so you must NOT call getWritableDatabase() (or getReadableDatabase() in there).




回答2:


Need to see your code, but I suspect you're not calling SQLiteOpenHelper at the correct point in your startup.

It's OK to create your SQLiteOpenHelper object in onCreate(), but don't open the database until you need to read or write. In a content provider, the standard pattern is to create the SQLiteOpenHelper in ContentProvider.onCreate(), but not call getWriteableDatabase() until an access comes in.



来源:https://stackoverflow.com/questions/9547259/java-lang-illegalstateexceptiongetwritabledatabase-called-recursively

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!