在android studio

时间:2015-12-16 16:37:20

标签: java android android-emulator

我一直在使用android studio来制作测验应用程序。我正在尝试进行测验应用程序。在一天之前应用程序运行正常但是当我今天尝试运行它时,我得到运行时异常。我没有收到任何错误。发生以下异常..

    AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: login.com.quiz1, PID: 2279
    java.lang.RuntimeException: Unable to start activity ComponentInfo{login.com.quiz1/login.com.quiz1.MainActivity}: java.lang.IllegalStateException: getDatabase called recursively
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.IllegalStateException: getDatabase called recursively
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)
            at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
            at login.com.quiz1.DbHelper.addQuestion(DbHelper.java:71)
            at login.com.quiz1.DbHelper.addQuestions(DbHelper.java:41)
            at login.com.quiz1.DbHelper.onCreate(DbHelper.java:35)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
            at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
            at login.com.quiz1.DbHelper.getAllQuestions(DbHelper.java:87)
            at login.com.quiz1.MainActivity.onCreate(MainActivity.java:30)
            at android.app.Activity.performCreate(Activity.java:6237)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-16 21:03:40.813    2279-2286/login.com.quiz1 W/art﹕ Suspending all threads took: 11.315ms
12-16 21:07:53.961    2279-2279/? I/Process﹕ Sending signal. PID: 2279 SIG: 9

以下是启动测验时崩溃的java / activity文件:

package login.com.quiz1;

import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends Activity {
    List<Question> quesList;
    int score=0;
    int qid=0;
    Question currentQ;
    TextView txtQuestion;
    RadioButton rda, rdb, rdc,rdd;
    Button butNext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DbHelper db=new DbHelper(this);
        quesList=db.getAllQuestions();
        currentQ=quesList.get(qid);
        txtQuestion=(TextView)findViewById(R.id.textView1);
        rda=(RadioButton)findViewById(R.id.radio0);
        rdb=(RadioButton)findViewById(R.id.radio1);
        rdc=(RadioButton)findViewById(R.id.radio2);
        rdd=(RadioButton)findViewById(R.id.radio3);
        butNext=(Button)findViewById(R.id.button1);
        setQuestionView();



        butNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1);
                RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId());
                Log.d("yourans", currentQ.getANSWER()+" "+answer.getText());
                if(currentQ.getANSWER().equals(answer.getText()))
                {
                    score++;
                    Log.d("score", "Your score"+score);
                }
                if(qid<7){
                    currentQ=quesList.get(qid);
                    setQuestionView();
                }else{
                    Intent intent = new Intent(MainActivity.this, ResultActivity.class);
                    Bundle b = new Bundle();
                    b.putInt("score", score); //Your score
                    intent.putExtras(b); //Put your score to your next Intent
                    startActivity(intent);
                    finish();
                }
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {


        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    private void setQuestionView()
    {
        txtQuestion.setText(currentQ.getQUESTION());
        rda.setText(currentQ.getOPTA());
        rdb.setText(currentQ.getOPTB());
        rdc.setText(currentQ.getOPTC());
        rdd.setText(currentQ.getOPTD());

        qid++;
    }
}

这是我的xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="@drawable/creatorb2">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <RadioGroup
            android:id="@+id/radioGroup1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.04"
           >
            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="false"
                android:text="RadioButton" />
            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
            <RadioButton
                android:id="@+id/radio3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

        </RadioGroup>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/logo" />

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/str_next" />
    </LinearLayout>
</RelativeLayout>

DBHelper

public class DbHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "Quiz";
    // tasks table name
    private static final String TABLE_QUEST = "quest";
    // tasks Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_QUES = "question";
    private static final String KEY_ANSWER = "answer"; //correct option
    private static final String KEY_OPTA= "opta"; //option a
    private static final String KEY_OPTB= "optb"; //option b
    private static final String KEY_OPTC= "optc"; //option c
    private static final String KEY_OPTD= "optd"; //option d
    private SQLiteDatabase dbase;
    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        dbase=db;
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " ( "
                + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUES
                + " TEXT, " + KEY_ANSWER+ " TEXT, "+KEY_OPTA +" TEXT, "
                +KEY_OPTB +" TEXT, "+KEY_OPTC+" TEXT,"+ KEY_OPTD+" TEXT)";
        db.execSQL(sql);
        addQuestions();
        //db.close();
    }
    private void addQuestions()
    {
        Question q1=new Question("1.A fruit seller had some apples. He sells 40% apples and still has 420 apples. Originally, he had:?","588 apples", "600 apples", "672 apples","600 apples","588 apples");
        this.addQuestion(q1);
        //correct ans-588
        Question q2=new Question("2.The square root of (7 + 35) (7 - 35) is", "2","5","2","4","35");
        this.addQuestion(q2);
        //correct ans-2
        Question q3=new Question("3.A man buys a cycle for Rs. 1400 and sells it at a loss of 15%. What is the selling price of the cycle?", "1190", "1160", "1190", "1202","1090");
        this.addQuestion(q3);
        //correct ans-1190
        Question q4=new Question("4.Which of the following is a prime number", "91", "31", "61", "71","91");
        this.addQuestion(q4);
        //correct ans-91
        Question q5=new Question("5.If 144/0.144 = 14.4/x, then the value of x is:?","0.0144", "1.44","14.4", "144","0.0144" );
        this.addQuestion(q5);
        //correct ans-0.0144
        Question q6=new Question("6.If mean and median for a particular experiment is 101 and 100 respectively find the mode","98", "99", "100","101","98");
        this.addQuestion(q6);
        //correct ans-98
        Question q7=new Question("7.Find the odd man out 6, 9, 15, 21, 24, 28, 30?","28","21","24","30","28");
        this.addQuestion(q7);
        //correct ans-28
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUEST);
        // Create tables again
        onCreate(db);
    }
    // Adding new question
    public void addQuestion(Question quest) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_QUES, quest.getQUESTION());
        values.put(KEY_ANSWER, quest.getANSWER());
        values.put(KEY_OPTA, quest.getOPTA());
        values.put(KEY_OPTB, quest.getOPTB());
        values.put(KEY_OPTC, quest.getOPTC());
        values.put(KEY_OPTD, quest.getOPTD());

        // Inserting Row
        dbase.insert(TABLE_QUEST, null, values);
    }
    public List<Question> getAllQuestions() {
        List<Question> quesList = new ArrayList<Question>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_QUEST;
        dbase=this.getReadableDatabase();
        Cursor cursor = dbase.rawQuery(selectQuery, null);
        // looping through all rows and adding to list

            if (cursor.moveToFirst()) {
                do {
                    Question quest = new Question();
                    quest.setID(cursor.getInt(0));
                    quest.setQUESTION(cursor.getString(1));
                    quest.setANSWER(cursor.getString(6));
                    quest.setOPTA(cursor.getString(2));
                    quest.setOPTB(cursor.getString(3));
                    quest.setOPTC(cursor.getString(4));
                    quest.setOPTD(cursor.getString(5));

                    quesList.add(quest);
                } while (cursor.moveToNext());
            }

        // return quest list
        return quesList;
    }
    public int rowcount()
    {
        int row=0;
        String selectQuery = "SELECT  * FROM " + TABLE_QUEST;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        row=cursor.getCount();
        return row;
    }
}

2 个答案:

答案 0 :(得分:0)

    txtQuestion.setText(currentQ.getQUESTION());

你的问题课在哪里? 和DbHelper

在我看来,你是在递归地调用getDatabase方法(可能通过你的dbHelper)。正如它在Log上清楚地说的那样:

 Caused by: java.lang.IllegalStateException: getDatabase called recursively
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)

锁定这些代码行

     at login.com.quiz1.DbHelper.addQuestion(DbHelper.java:71)
        at login.com.quiz1.DbHelper.addQuestions(DbHelper.java:41)
        at login.com.quiz1.DbHelper.onCreate(DbHelper.java:35)

答案 1 :(得分:0)

请勿在{{1​​}}:

中执行此操作
onCreate

让SQLiteOpenHelper完成创建数据库,然后添加一个单独的方法 SQLiteDatabase db = this.getWritableDatabase(); 来处理数据库

如果您需要预填充数据库,只需执行您的语句而无需获取可写的数据库实例 - 您已经在onCreate中传递了一个