#android #sqlite #android-studio
#Android #sqlite #android-studio
Вопрос:
Это мой вспомогательный класс базы данных:
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;
}
Это моя деятельность, в которой я создаю объект для вспомогательного класса, но во время выполнения кода он возвращает null, когда я пытаюсь вызвать этот метод mQuizDbHelper.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) amp;amp; TextUtils.isEmpty(s2) amp;amp;
TextUtils.isEmpty(s3) amp;amp;TextUtils.isEmpty(s4) amp;amp;
TextUtils.isEmpty(s5) amp;amp;TextUtils.isEmpty(s6) amp;amp;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();
}
}
}
Это ошибка, которую я получаю: не удается найти локальную переменную ‘exception’ во время отладки.
Комментарии:
1. Опубликовать полное сообщение об ошибке. Также, что вы подразумеваете под тем, что он возвращает null, когда я пытаюсь вызвать этот метод mQuizDbHelper.addQuestion(вопрос); ? Вы получаете исключение нулевого указателя?
2. ДА. Это ошибка: ((Исключение NullPointerException)). detailMessage = Не удается найти локальную переменную ‘exception’