Строки преобразуются странным образом при вставке в базу данных - PullRequest
0 голосов
/ 04 мая 2020

Я студент, работающий над моим первым Android студийным проектом. Мои попытки поиска этой проблемы привели к большому количеству результатов форматирования даты, которые, я уверен, не проблема.

Я создаю объект с параметрами int и тремя String. Две строки преобразуются из объекта Date. Кажется, все идет хорошо, пока я не позвоню в DAO, чтобы вставить его в базу данных. Он вставляет, но две строки преобразованных дат больше не являются строками. Может кто-нибудь сказать мне, почему это происходит и как я могу остановить это? Мои лучшие догадки по необходимому коду ниже:

@Override
protected Void doInBackground(final Void... params) {

    mTermDao.deleteAllTerms();

    Calendar calobj = Calendar.getInstance();
    calobj.add(Calendar.MONTH, -3);
    calobj.add(Calendar.DATE, -3);
    Date notToday = calobj.getTime();
    calobj.add(Calendar.MONTH, 6);
    Date next = calobj.getTime();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
    String strDateOne = dateFormat.format(notToday);
    String strDateTwo = dateFormat.format(next);
    String termTitle = "Term 1";

    TermEntity termEntity= new TermEntity(1,termTitle, strDateOne, strDateTwo);
    mTermDao.insert(termEntity);

    return null;
}

И Dao

@Dao
public interface TermDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(TermEntity termEntity);
}

ViewModel

public class TermViewModel extends AndroidViewModel {
    private ScheduleRepository mRepository;
    private LiveData<List<TermEntity>> mAllTerms;
    public TermViewModel(Application application){
        super(application);
        mRepository=new ScheduleRepository(application);
        mAllTerms =mRepository.getAllTerms();
    }
    public LiveData<List<TermEntity>> getAllTerms(){
        return mAllTerms;
    }
    public void insert(TermEntity termEntity){
        mRepository.insert(termEntity);
    }
    public void delete(TermEntity termEntity){
        mRepository.delete(termEntity);
    }
    public int lastID(){
        return mAllTerms.getValue().size();
    }
}

TermEntity

@Entity(tableName="term_table")
public class TermEntity {

    @PrimaryKey
    private int termId;
    private String termTitle;
    private String termStart;
    private String termEnd;

    public TermEntity(int termId, String termTitle, String termStart, String termEnd) {
        this.termId = termId;
        this.termTitle = termTitle;
        this.termStart = termStart;
        this.termEnd = termEnd;
    }

    @Override
    public String toString() {
        return "TermEntity{" +
                "termId=" + termId +
                ", termTitle='" + termTitle + '\'' +
                ", termStart=" + termStart +
                ", termEnd=" + termEnd +
                '}';
    }

    public int getTermId() {
        return termId;
    }

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

    public String getTermTitle() {
        return termTitle;
    }

    public void setTermTitle(String termTitle) {
        this.termTitle = termTitle;
    }

    public String getTermStart() {
        return termStart;
    }

    public void setTermStart(String termStart) {
        this.termStart = termStart;
    }

    public String getTermEnd() {
        return termEnd;
    }

    public void setTermEnd(String termEnd) {
        this.termEnd = termEnd;
    }
}

TermAdapter, к которому осуществляется доступ к объекту.

public class TermAdapter extends RecyclerView.Adapter<TermAdapter.TermViewHolder> {

    class TermViewHolder extends RecyclerView.ViewHolder {
        private final TextView termItemView;


        private TermViewHolder(View itemView) {
            super(itemView);
            termItemView = itemView.findViewById(R.id.termTextView);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    final TermEntity current = mTerms.get(position);
                    Intent intent = new Intent(context, TermDetailsActivity.class);
                    intent.putExtra("termTitle", current.getTermTitle());
                    intent.putExtra("startTerm", current.getTermStart());
                    intent.putExtra("endTerm", current.getTermEnd());
                    intent.putExtra("termId", current.getTermId());
                    intent.putExtra("position",position);
                    context.startActivity(intent);
                }
            });
        }
    }

Из действия, где получено намерение

        if(getIntent().getStringExtra("termTitle")!=null) {
            String start = getIntent().getStringExtra("termStart");
            nameView.setText(getIntent().getStringExtra("termTitle"));
            startView.setText(start);
            endView.setText(getIntent().getStringExtra("termEnd"));
        } 

Он создает объект и вставляет в базу данных, но позже, когда я используйте функцию get для начальной и конечной строк для заполнения textView, они отображаются как нулевые. В программе нет ошибок, поля просто выглядят пустыми.

Я должен добавить, что моя теория основана на запуске отладки с контрольными точками в последних двух строках первого блока кода. В этой строке: TermEntity termEntity = new TermEntity (1, termTitle, strDateOne, strDateTwo); моя IDE показала значения для strDateOne и strDateTwo в виде строк. Однако, когда он запустил следующую строку, вместо того, чтобы заключаться в одинарные кавычки, такие как «Термин 1», у них не было кавычек.

1 Ответ

0 голосов
/ 04 мая 2020

Вы просто используете неправильные имена пакетов намерений. "startTerm", "termStart" и для завершения и т. д.

Чтобы избежать этого, используйте постоянную строку INTENT_CONST в операции отправки и используйте ее из операции получения, например intent.getExtras(SendingActivity.INTENT_CONST, value);

...