首页 > 解决方案 > 单击开始按钮后应用程序崩溃

问题描述

我是使用 Android Studio 的新手,并且一直在使用 youtube 上的指南来开发测验应用程序。到目前为止,一切都在工作,直到试图把我的问题数据库带过来。在我保存代码并在物理设备上重新运行代码后,应用程序将打开,但当我单击开始按钮时,应用程序关闭。在 logcat 中,我收到运行时错误

    java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example.greencrosscodev1/com.example.greencrosscodev1.QuizSection}: 
android.database.sqlite.SQLiteException: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY 
(code 1 SQLITE_ERROR[1]): , while compiling: CREATE TABLE quiz_question ( _idINTEGER PRIMARY KEY 
AUTOINCREMENT, questionTEXT, option1TEXT, option2TEXT, option3TEXT, answer_nrINTEGER)

通过在上面的代码中说同样的话,它给了我一个原因。我来的第一个蓝色超链接也将我带到我的 QuizDbHelper.java 到下面显示的第 40 行。之后是一整页的代码。任何建议都会被采纳

package com.example.greencrosscodev1;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.example.greencrosscodev1.QuizContract.*;

import androidx.annotation.Nullable;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class QuizDbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME ="GreenCrossCodeQuiz.db";
private static final int DATABASE_VERSION = 1;

private SQLiteDatabase db;

public QuizDbHelper(@Nullable Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    this.db= db;

    final String SQL_CREATE_QUESTION_TABLE ="CREATE TABLE " +
            QuestionTable.TABLE_NAME + " ( " +
            QuestionTable._ID + "INTEGER PRIMARY KEY AUTOINCREMENT, " +
            QuestionTable.COLUMN_QUESTION + "TEXT, " +
            QuestionTable.COLUMN_OPTION1 + "TEXT, " +
            QuestionTable.COLUMN_OPTION2 + "TEXT, " +
            QuestionTable.COLUMN_OPTION3 + "TEXT, " +
            QuestionTable.COLUMN_ANSWER_NR + "INTEGER" + ")";

    db.execSQL(SQL_CREATE_QUESTION_TABLE);
    fillQuestionTable();
}

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

private void fillQuestionTable(){
    Question Q1 = new Question("A is correct","A","B","C", 1);
    addQuestion(Q1);

    Question Q2 = new Question("B is correct","A","B","C", 2);
    addQuestion(Q2);

    Question Q3 = new Question("C is correct","A","B","C", 3);
    addQuestion(Q3);

    Question Q4 = new Question("A is correct again","A","B","C", 1);
    addQuestion(Q4);

    Question Q5 = new Question("B is correct again","A","B","C", 2);
    addQuestion(Q5);
}

private void addQuestion(Question question){
    ContentValues cv = new ContentValues();
    cv.put(QuestionTable.COLUMN_QUESTION, question.getQuestion());
    cv.put(QuestionTable.COLUMN_OPTION1, question.getOption1());
    cv.put(QuestionTable.COLUMN_OPTION2, question.getOption2());
    cv.put(QuestionTable.COLUMN_OPTION3, question.getOption3());
    cv.put(QuestionTable.COLUMN_ANSWER_NR, question.getAnswerNumber());
    db.insert(QuestionTable.TABLE_NAME, null, cv);
}

public List<Question> getAllQuestions(){
    List<Question> questionList = new ArrayList<>();
    db = getReadableDatabase();
    Cursor c = db.rawQuery("SELECT * FROM " + QuestionTable.TABLE_NAME, null);
    if(c.moveToFirst()){
        do {
            Question question = new Question();
            question.setQuestion(c.getString(c.getColumnIndex(QuestionTable.COLUMN_QUESTION)));
            question.setOption1(c.getString(c.getColumnIndex(QuestionTable.COLUMN_OPTION1)));
            question.setOption2(c.getString(c.getColumnIndex(QuestionTable.COLUMN_OPTION2)));
            question.setOption3(c.getString(c.getColumnIndex(QuestionTable.COLUMN_OPTION3)));
            question.setAnswerNumber(c.getInt(c.getColumnIndex(QuestionTable.COLUMN_ANSWER_NR)));
            questionList.add(question);
        } while (c.moveToNext());
    }
    c.close();
    return questionList;
}
}

标签: javaandroid

解决方案


推荐阅读