Android-приложение, использующее данные SQLite «Попытка вызвать виртуальный метод« ... »для ссылки на пустой объект» - PullRequest
0 голосов
/ 12 октября 2018

Я пишу приложение для Android, и у меня возникла проблема с обнаружением ошибки.Я пытаюсь получить данные из базы данных SQLite.Приложение работает нормально до тех пор, пока я не вызову активность, и оно вылетает.

Вот код, который у меня есть:

ошибка в строке mTerm = mDBHelper.getTerm (((Term) i.getSerializableExtra («term»)). getTermId ())

Ошибка: попытка вызвать виртуальный метод int com.example ... Term.getTermId () для нулевой ссылки на объект

Activity

public class TermDetailsActivity extends AppCompatActivity {

private Term mTerm;
private DBOpenHelper mDBHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_term_details);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    setTitle("Term Details");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    mDBHelper = new DBOpenHelper(this);
    Intent i = getIntent();
    mTerm = mDBHelper.getTerm(((Term) i.getSerializableExtra("term")).getTermId());
    setTextViews();
}

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    menu.findItem(R.id.edit).setVisible(true);
    return true;
}

private void setTextViews() {
    TextView Title = findViewById(R.id.term_details_name_value);
    TextView Start = findViewById(R.id.term_start_date_value);
    TextView End = findViewById(R.id.term_end_date_value);
    Title.setText(mTerm.getTermName());
    Start.setText(mTerm.getTermStart());
    End.setText(mTerm.getTermEnd());
}


}

Мой DBHelper расширяет SQLiteOpenHelper, и таблицы создаются нормально.Я могу использовать следующий код для извлечения данных о другой деятельности.

DBHelper

public Term getTerm(int termId) {
    Term term;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery(
            "SELECT * FROM " + TABLE_TERMS + " WHERE " + TERM_ID + " = " + 
termId, null);

    res.moveToFirst();
    term = new Term(
            res.getInt(0),
            res.getString(1),
            res.getString(2),
            res.getString(3));
    res.close();
    return term;
}

Класс терминов

public class Term implements Serializable {

private int termId;
private String termName;
private String termStart;
private String termEnd;
public Term(int termId, String termName, String termStart, String termEnd){

    this.termId = termId;
    this.termName = termName;
    this.termStart = termStart;
    this.termEnd = termEnd;
}

public int getTermId(){
    return termId;
}

public void setTermId(int termId){
    this.termId = termId;
}

1 Ответ

0 голосов
/ 12 октября 2018

Привет, попробуйте извлечь Term в переменную, прежде чем использовать его в DBHelper.Я подозреваю, что дополнительное отсутствует, и когда вызов getSerializableExtra возвращает getTermId , вызывается на ноль, вызывая исключение.

Редактировать:

Вот что я имею в виду, извлекая в переменную:

Intent i = getIntent();
Term term = i.getSerializableExtra("term"); // <- this might be null
// Place a breakpoint on the next line to verify
mTerm = mDBHelper.getTerm(term.getTermId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...