2016-07-10 4 views
2

퀴즈를 풀 수있는 앱을 만들려고합니다 (예 : 세계 퀴즈). 주 활동에서 사용자는 퀴즈의 카테고리를 선택하기 위해 엔터 버튼을 누르고, 우리가 세계사를 선택했다고 가정 해 봅시다. 그리고 나서 그것은 세계 역사 활동에 가야한다고 추측하지만 충돌합니다. Android SQLite 퀴즈 App

public class WorldHistory extends AppCompatActivity { 
    List<Question> questionList; 
    int score = 0; 
    int questionID = 0; 

    Question currentQuestion; 
    TextView txtQuestion; 
    RadioButton rbtnA, rbtnB, rbtnC, rbtnD; 
    Button btnNext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_world_history); 

     DatabaseHandler dba = new DatabaseHandler(this); 
     questionList = dba.getAllQuestions(); 
     currentQuestion = questionList.get(questionID); 

     txtQuestion = (TextView) findViewById(R.id.txtQuestion); 
     rbtnA = (RadioButton) findViewById(R.id.rtbOptionA); 
     rbtnB = (RadioButton) findViewById(R.id.rtbOptionB); 
     rbtnC = (RadioButton) findViewById(R.id.rtbOptionC); 
     rbtnD = (RadioButton) findViewById(R.id.rtbOptionD); 
     btnNext = (Button) findViewById(R.id.btnNext); 

     setQuestionView(); 
    } 

    private void setQuestionView() { 
     txtQuestion.setText(currentQuestion.getQuestion()); 
     rbtnA.setText(currentQuestion.getOptionA()); 
     rbtnB.setText(currentQuestion.getOptionB()); 
     rbtnC.setText(currentQuestion.getOptionC()); 
     rbtnD.setText(currentQuestion.getOptionD()); 
     questionID++; 
    } 
}  
WorldHistory.java

Question.java

public class Question { 
    private int ID; 
    private String Question, optionA, optionB, optionC, optionD, Answer; 

    public Question() { 
     ID = 0; 
     Question = ""; 
     optionA = ""; 
     optionB = ""; 
     optionC = ""; 
     optionD = ""; 
     Answer = ""; 
    } 

    public Question(String Question, String optionA, String optionB, String optionC, 
        String optionD, String Answer) { 
     this.Question = Question; 
     this.optionA = optionA; 
     this.optionB = optionB; 
     this.optionC = optionC; 
     this.optionD = optionD; 
     this.Answer = Answer; 
    } 

    public int getID() { 
     return ID; 
    } 

    public String getQuestion() { 
     return Question; 
    } 

    public String getOptionA() { 
     return optionA; 
    } 

    public String getOptionB() { 
     return optionB; 
    } 

    public String getOptionC() { 
     return optionC; 
    } 

    public String getOptionD() { 
     return optionD; 
    } 

    public String getAnswer() { 
     return Answer; 
    } 

    public void setID(int ID) { 
     this.ID = ID; 
    } 

    public void setQuestion(String Question) { 
     this.Question = Question; 
    } 

    public void setOptionA(String optionA) { 
     this.optionA = optionA; 
    } 

    public void setOptionB(String optionB) { 
     this.optionB = optionB; 
    } 

    public void setOptionC(String optionC) { 
     this.optionC = optionC; 
    } 

    public void setOptionD(String optionD) { 
     this.optionD = optionD; 
    } 

    public void setAnswer(String answer) { 
     Answer = answer; 
    } 
} 

DatabaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "quiz"; 
    private static final String TABLE_NAME = "worldhistory"; 
    private static final String KEY_ID = "id"; 
    private static final String QUESTIONS = "question"; 
    private static final String ANSWER = "answer"; 
    private static final String OPTIONA = "optiona"; 
    private static final String OPTIONB = "optionb"; 
    private static final String OPTIONC = "optionc"; 
    private static final String OPTIOND = "optiond"; 

    private SQLiteDatabase dba; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" 
       + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + QUESTIONS + " TEXT, " 
       + ANSWER + " TEXT, " + OPTIONA + " TEXT, " + OPTIONB + " TEXT, " + OPTIONC 
       + " TEXT, " + OPTIOND + " TEXT)"; 

     db.execSQL(CREATE_TABLE); 

     addQuestions(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXITS " + TABLE_NAME); 
     onCreate(db); 
    } 

    // creating the questions, options, and answers 
    private void addQuestions() { 
     Question q1 = new Question("World War I began in which year?", "1923", 
       "1938", "1917", "1914", "D"); 
     this.addQuestion(q1); 

     Question q2 = new Question("Adolf Hitler was born in which country?", 
       "France", "Germany", "Austria", "Hungary", "C"); 
     this.addQuestion(q2); 

     //add more questions 
    } 

    // addding new questions to db 
    public void addQuestion(Question question) { 
     ContentValues values = new ContentValues(); 
     values.put(QUESTIONS, question.getQuestion()); 
     values.put(ANSWER, question.getAnswer()); 
     values.put(OPTIONA, question.getOptionA()); 
     values.put(OPTIONB, question.getOptionB()); 
     values.put(OPTIONC, question.getOptionC()); 
     values.put(OPTIOND, question.getOptionD()); 

     dba.insert(TABLE_NAME, null, values); 
    } 

    public List<Question> getAllQuestions() { 
     List<Question> questionList = new ArrayList<Question>(); 

     String query = "SELECT * FROM " + TABLE_NAME; 
     dba = this.getReadableDatabase(); 
     Cursor cursor = dba.rawQuery(query, null); 

     if (cursor.moveToFirst()) { 
      do { 
       Question quest = new Question(); 
       quest.setID(cursor.getInt(0)); 
       quest.setQuestion(cursor.getString(1)); 
       quest.setAnswer(cursor.getString(2)); 
       quest.setOptionA(cursor.getString(3)); 
       quest.setOptionB(cursor.getString(4)); 
       quest.setOptionC(cursor.getString(5)); 
       quest.setOptionD(cursor.getString(6)); 

       questionList.add(quest); 

      } while (cursor.moveToNext()); 
     } 

     cursor.close(); 
     dba.close(); 
     return questionList; 
    } 

    public int rowCount() { 
     int row = 0; 
     String query = "SELECT * FROM " + TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 
     row = cursor.getCount(); 

     cursor.close(); 
     return row; 
    } 
} 

: 여기 내 코드는 뭐가 잘못된 건지 모르겠다, 지금까지입니다

다음은 오류 메시지입니다.

07-10 20:04:11.346 2514-2514/com.example.nasimahmed.quizgame E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.example.nasimahmed.quizgame, PID: 2514 


java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.nasimahmed.quizgame/com.example.nasimahmed.quizgame.WorldHistory}: java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference 


                        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.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference 
                        at com.example.nasimahmed.quizgame.DatabaseHandler.addQuestion(DatabaseHandler.java:81) 
                        at com.example.nasimahmed.quizgame.DatabaseHandler.addQuestions(DatabaseHandler.java:61) 
                        at com.example.nasimahmed.quizgame.DatabaseHandler.onCreate(DatabaseHandler.java:46) 
                        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 
                        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) 
                        at com.example.nasimahmed.quizgame.DatabaseHandler.getAllQuestions(DatabaseHandler.java:89) 
                        at com.example.nasimahmed.quizgame.WorldHistory.onCreate(WorldHistory.java:29) 
                        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) 
+0

충돌에 대한 스택 추적을 게시하십시오. –

+0

스택 트레이스를 게시하고 버튼에 대한 onClick 리스너 구현 – TechnoBlahble

+1

순수한 'NullPointer'입니다 .. !! 이것은 어떻게 4 개의 투표를 할 수 있습니까 ?? @ Nasim 'Sqlite'를 열기위한 코드는 어디에 있습니까 ?? 'getReadable/WriteableDatabase'와 같은 것 ?? –

답변

2

사용 :

public class DatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "quiz"; 
    private static final String TABLE_NAME = "worldhistory"; 
    private static final String KEY_ID = "id"; 
    private static final String QUESTIONS = "question"; 
    private static final String ANSWER = "answer"; 
    private static final String OPTIONA = "optiona"; 
    private static final String OPTIONB = "optionb"; 
    private static final String OPTIONC = "optionc"; 
    private static final String OPTIOND = "optiond"; 

    private SQLiteDatabase dba; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" 
       + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + QUESTIONS + " TEXT, " 
       + ANSWER + " TEXT, " + OPTIONA + " TEXT, " + OPTIONB + " TEXT, " + OPTIONC 
       + " TEXT, " + OPTIOND + " TEXT)"; 

     db.execSQL(CREATE_TABLE); 

     addQuestions(db); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXITS " + TABLE_NAME); 
     onCreate(db); 
    } 

    // creating the questions, options, and answers 
    private void addQuestions(SQLiteDatabase db) { 
     Question q1 = new Question("World War I began in which year?", "1923", 
       "1938", "1917", "1914", "D"); 
     this.addQuestion(q1, db); 

     Question q2 = new Question("Adolf Hitler was born in which country?", 
       "France", "Germany", "Austria", "Hungary", "C"); 
     this.addQuestion(q2, db); 

     //add more questions 
    } 

    // addding new questions to db 
    public void addQuestion(Question question, SQLiteDatabase db) { 
     ContentValues values = new ContentValues(); 
     values.put(QUESTIONS, question.getQuestion()); 
     values.put(ANSWER, question.getAnswer()); 
     values.put(OPTIONA, question.getOptionA()); 
     values.put(OPTIONB, question.getOptionB()); 
     values.put(OPTIONC, question.getOptionC()); 
     values.put(OPTIOND, question.getOptionD()); 

     db.insert(TABLE_NAME, null, values); 
    } 

    public List<Question> getAllQuestions() { 
     List<Question> questionList = new ArrayList<Question>(); 

     String query = "SELECT * FROM " + TABLE_NAME; 
     dba = this.getReadableDatabase(); 
     Cursor cursor = dba.rawQuery(query, null); 

     if (cursor.moveToFirst()) { 
      do { 
       Question quest = new Question(); 
       quest.setID(cursor.getInt(0)); 
       quest.setQuestion(cursor.getString(1)); 
       quest.setAnswer(cursor.getString(2)); 
       quest.setOptionA(cursor.getString(3)); 
       quest.setOptionB(cursor.getString(4)); 
       quest.setOptionC(cursor.getString(5)); 
       quest.setOptionD(cursor.getString(6)); 

       questionList.add(quest); 

      } while (cursor.moveToNext()); 
     } 

     cursor.close(); 
     dba.close(); 
     return questionList; 
    } 

    public int rowCount() { 
     int row = 0; 
     String query = "SELECT * FROM " + TABLE_NAME; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 
     row = cursor.getCount(); 

     cursor.close(); 
     return row; 
    } 
} 
+0

충돌하고 동일한 오류 메시지가 나타납니다. –

+0

'onCreate','addQuestions' 및'addQuestion' 메소드를 변경 했습니까? dba가 결코 instanciate하지 않기 때문에'dba.insert'가 아닌'dba.insert' –

+0

을 사용해야합니다 ... –

0

dba은 데이터베이스를 db으로 생성하므로 null을 반환합니다. 따라서 대신 db.insert을 사용하십시오. 이 DatabaseHandler 대신

+0

db는 onCreate 메서드에서만 테이블을 생성하기 때문에 db를 사용할 수 없습니다. –

1

변경에 삽입 방법,

public void addQuestion(Question question) 
    { 
     dba = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(QUESTIONS, question.getQuestion()); 
     values.put(ANSWER, question.getAnswer()); 
     values.put(OPTIONA, question.getOptionA()); 
     values.put(OPTIONB, question.getOptionB()); 
     values.put(OPTIONC, question.getOptionC()); 
     values.put(OPTIOND, question.getOptionD()); 

     dba.insert(TABLE_NAME, null, values); 
    } 
관련 문제