首页 > 解决方案 > 数据库助手对象在运行时返回 null-Android

问题描述

这是我的数据库助手类:

    package edu.niu.cs.z1886742;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    import edu.niu.cs.z1886742.QuizContract.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class QuizDbHelper extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "MyAwesomeQuiz";
        private static final int DATABASE_VERSION = 1;
    
        public static QuizDbHelper instance;
    
    
    
        QuizDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
    
    
        public static synchronized QuizDbHelper getInstance(Context context) {
            if (instance == null) {
                instance = new QuizDbHelper(context.getApplicationContext());
            }
            return instance;
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
    
            final String SQL_CREATE_CATEGORIES_TABLE = "CREATE TABLE " +
                    CategoriesTable.TABLE_NAME + "( " +
                    CategoriesTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    CategoriesTable.COLUMN_NAME + " TEXT " +
                    ")";
    
            final String SQL_CREATE_QUESTIONS_TABLE = "CREATE TABLE " +
                    QuestionsTable.TABLE_NAME + " ( " +
                    QuestionsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    QuestionsTable.COLUMN_QUESTION + " TEXT, " +
                    QuestionsTable.COLUMN_OPTION1 + " TEXT, " +
                    QuestionsTable.COLUMN_OPTION2 + " TEXT, " +
                    QuestionsTable.COLUMN_OPTION3 + " TEXT, " +
                    QuestionsTable.COLUMN_OPTION4 + " TEXT, " +
                    QuestionsTable.COLUMN_ANSWER_NR + " INTEGER, " +
                    QuestionsTable.COLUMN_CATEGORY_ID + " INTEGER, " +
                    "FOREIGN KEY(" + QuestionsTable.COLUMN_CATEGORY_ID + ") REFERENCES " +
                    CategoriesTable.TABLE_NAME + "(" + CategoriesTable._ID + ")" + "ON DELETE CASCADE" +
                    ")";
    
            db.execSQL(SQL_CREATE_CATEGORIES_TABLE);
            db.execSQL(SQL_CREATE_QUESTIONS_TABLE);
            fillCategoriesTable();
            fillQuestionsTable();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + CategoriesTable.TABLE_NAME);
            db.execSQL("DROP TABLE IF EXISTS " + QuestionsTable.TABLE_NAME);
            onCreate(db);
        }
    
        @Override
        public void onConfigure(SQLiteDatabase db) {
            super.onConfigure(db);
            db.setForeignKeyConstraintsEnabled(true);
        }
    
        private void fillCategoriesTable() {
            for (int i=1;  i<13; i++){
                Category c = new Category("Week "+ i);
                insertCategory(c);
            }
        }
    
    //    public void addCategory(Category category) {
    //        db = getWritableDatabase();
    //        insertCategory(category);
    //    }
    //
    //    public void addCategories(List<Category> categories) {
    //        db = getWritableDatabase();
    //
    //        for (Category category : categories) {
    //            insertCategory(category);
    //        }
    //    }
    
        private void insertCategory(Category category) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(CategoriesTable.COLUMN_NAME, category.getName());
            db.insert(CategoriesTable.TABLE_NAME, null, cv);
        }
    
        private void fillQuestionsTable() {
            Question q1 = new Question("Most lines in a C++ program end with a",
                    ": (colon)", "; (semicolon)", "} (closing brace)",") (closing parenthesis)", 1,Category.WEEK1);
            insertQuestion(q1);
            Question q2 = new Question("main() marks the beginning of a C++ program. What C++ reserved word precedes it?",
                    "#include", "using", "void","int", 2,
                     Category.WEEK1);
            insertQuestion(q2);
            Question q3 = new Question("What is the correct way to declare an integer variable named \"score\"?",
                    "#int score", "score: integer;", "integer score;","none of the above", 2,
                    Category.WEEK1);
            insertQuestion(q3);
        }
    
        public void addQuestion(Question question) {
            insertQuestion(question);
    
        }
    
        public void addQuestions(List<Question> questions) {
            SQLiteDatabase db = this.getWritableDatabase();
    
            for (Question question : questions) {
                insertQuestion(question);
            }
        }
    
        public void insertQuestion(Question question) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(QuestionsTable.COLUMN_QUESTION, question.getQuestion());
            cv.put(QuestionsTable.COLUMN_OPTION1, question.getOption1());
            cv.put(QuestionsTable.COLUMN_OPTION2, question.getOption2());
            cv.put(QuestionsTable.COLUMN_OPTION3, question.getOption3());
            cv.put(QuestionsTable.COLUMN_OPTION4, question.getOption4());
            cv.put(QuestionsTable.COLUMN_ANSWER_NR, question.getAnswerNr());
            cv.put(QuestionsTable.COLUMN_CATEGORY_ID, question.getCategoryID());
            db.insert(QuestionsTable.TABLE_NAME, null, cv);
    
        }
    
        public List<Category> getAllCategories() {
            List<Category> categoryList = new ArrayList<>();
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor c = db.rawQuery("SELECT * FROM " + CategoriesTable.TABLE_NAME, null);
    
            if (c.moveToFirst()) {
                do {
                    Category category = new Category();
                    category.setId(c.getInt(c.getColumnIndex(CategoriesTable._ID)));
                    category.setName(c.getString(c.getColumnIndex(CategoriesTable.COLUMN_NAME)));
                    categoryList.add(category);
                } while (c.moveToNext());
            }
    
            c.close();
            return categoryList;
        }
    
        public ArrayList<Question> getAllQuestions() {
            ArrayList<Question> questionList = new ArrayList<>();
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor c = db.rawQuery("SELECT * FROM " + QuestionsTable.TABLE_NAME, null);
    
            if (c.moveToFirst()) {
                do {
                    Question question = new Question();
                    question.setId(c.getInt(c.getColumnIndex(QuestionsTable._ID)));
                    question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION)));
                    question.setOption1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION1)));
                    question.setOption2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION2)));
                    question.setOption3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION3)));
                    question.setAnswerNr(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER_NR)));
                    question.setCategoryID(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_CATEGORY_ID)));
                    questionList.add(question);
                } while (c.moveToNext());
            }
    
            c.close();
            return questionList;
        }
    
        public ArrayList<Question> getQuestions(int categoryID) {
            ArrayList<Question> questionList = new ArrayList<>();
            SQLiteDatabase db = this.getReadableDatabase();
    
            String selection = QuestionsTable.COLUMN_CATEGORY_ID + " = ? ";
            String[] selectionArgs = new String[]{String.valueOf(categoryID)};
    
            Cursor c = db.query(
                    QuestionsTable.TABLE_NAME,
                    null,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    null
            );
    
            if (c.moveToFirst()) {
                do {
                    Question question = new Question();
                    question.setId(c.getInt(c.getColumnIndex(QuestionsTable._ID)));
                    question.setQuestion(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_QUESTION)));
                    question.setOption1(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION1)));
                    question.setOption2(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION2)));
                    question.setOption3(c.getString(c.getColumnIndex(QuestionsTable.COLUMN_OPTION3)));
                    question.setAnswerNr(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_ANSWER_NR)));
                    question.setCategoryID(c.getInt(c.getColumnIndex(QuestionsTable.COLUMN_CATEGORY_ID)));
                    questionList.add(question);
                } while (c.moveToNext());
            }
    
            c.close();
            return questionList;
        }

这是我的活动,我正在为帮助类创建一个对象,但是在运行代码时,当我尝试调用此方法时它返回 nullmQuizDbHelper.addQuestion(question);

当我将鼠标悬停在mQuizDbHelper它显示的对象上时mDatabase = null;

    package edu.niu.cs.z1886742;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.ContentValues;
    import android.content.Intent;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class AddQuestionsActivity extends AppCompatActivity {
        QuizDbHelper mQuizDbHelper;
        EditText editText1;
        EditText editText2;
        EditText editText3;
        EditText editText4;
        EditText editText5;
        EditText editText6;
        EditText editText7;
        Button btn;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_questions);
            mQuizDbHelper = new QuizDbHelper(this);
            btn = (Button) findViewById(R.id.submitbtn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AddToDb();
                }
            });
        }
        private void AddToDb(){
            editText1 = (EditText) findViewById(R.id.enterquestion);
            String s1 = editText1.getText().toString();
            editText2 = (EditText) findViewById(R.id.opt1);
            String s2 = editText2.getText().toString();
            editText3 = (EditText) findViewById(R.id.opt2);
            String s3 = editText3.getText().toString();
            editText4 = (EditText) findViewById(R.id.opt3);
            String s4 = editText4.getText().toString();
            editText5 = (EditText) findViewById(R.id.opt4);
            String s5 = editText5.getText().toString();
            editText6 = (EditText) findViewById(R.id.weekid);
            String s6 = editText6.getText().toString();
            editText7 = (EditText) findViewById(R.id.crt);
            String s7 = editText7.getText().toString();
            int x =Integer.parseInt(s7);
    
            if(TextUtils.isEmpty(s1) && TextUtils.isEmpty(s2) &&
                    TextUtils.isEmpty(s3) &&TextUtils.isEmpty(s4) &&
                    TextUtils.isEmpty(s5) &&TextUtils.isEmpty(s6) &&TextUtils.isEmpty(s7)){
                Toast.makeText(AddQuestionsActivity.this, "Fill All Fields First!", Toast.LENGTH_SHORT).show();
    
            }
            else{
                Question question = new Question(s1,s2,s3,s4,s5,x,Category.WEEK1);
    
                mQuizDbHelper.addQuestion(question);
                Toast.makeText(AddQuestionsActivity.this, "Success!", Toast.LENGTH_SHORT).show();
            }
        }
    }

这是我得到的错误:调试时找不到局部变量“异常”。

标签: androidsqliteandroid-studio

解决方案


推荐阅读