2015-12-16 142 views
-1

我一直在使用android studio來測驗應用程序。我試圖做測驗應用程序。在一天之前應用程序正常工作,但是當我今天嘗試運行它時我得到運行時異常。我沒有得到任何錯誤。出現以下異常..在android工作室中運行應用程序時獲取運行時錯誤

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 /活動文件:

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; 
    } 
} 
+0

問題是'DbHelper'類顯示'DbHelper'class code –

+0

DBHelper是一項活動嗎?你在做這個類的onCreate方法是在做什麼「getDatabase調用遞歸」? – Hirak

+0

您實際的異常是'java.lang.IllegalStateException:getDatabase recursively調用',您只看到Runtime,因爲IllegalState冒泡未被捕獲。在StackOverflow上搜索'遞歸調用的'getDatabase' – vkislicins

回答

0
txtQuestion.setText(currentQ.getQUESTION()); 

你在哪裏得到問題類? 和DbHelper


在我看來,在那裏你調用getDatabase方法(可能通過您的dbHelper)遞歸。因爲它清楚地說上登錄:

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) 
0

不要做這裏面onCreate

SQLiteDatabase db = this.getWritableDatabase(); 

讓SQLiteOpenHelper完成創建數據庫,然後添加一個單獨的方法,將​​做的東西與數據庫

如果您需要預先填寫你的數據庫,只需執行你的語句沒有得到一個可寫的數據庫實例 - 你已經有了一個傳遞到你內心的onCreate

相關問題