saveCourse () должен запускать verifyMentor () для создания и / или проверки того, что текущая вводимая информация для наставника доступна для добавления в конструктор CourseEntity. mMentorViewModel.saveMentor (mMentor) должен начать сохранение нового наставника через репозиторий планировщика, а репозиторий планировщика использовал MentorDAO из базы данных для вставки нового наставника.
Я прочитал этот метод Android Комната - Получите идентификатор новой вставленной строки с помощью автоматического создания , но мне не хватает некоторых фундаментальных знаний о том, как получить только что созданную информацию наставника.
package com.example.wguscheduler.activities;
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.example.wguscheduler.R;
import com.example.wguscheduler.entities.CourseEntity;
import com.example.wguscheduler.entities.MentorEntity;
import com.example.wguscheduler.entities.TermEntity;
import com.example.wguscheduler.viewmodel.CourseViewModel;
import com.example.wguscheduler.viewmodel.MentorViewModel;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class CourseAddActivity extends AppCompatActivity {
private static final String TAG = "CourseAddActivity";
private CourseViewModel mCourseViewModel;
private MentorViewModel mMentorViewModel;
private EditText mCourseTitle, mCourseStartDate, mCourseEndDate,mCourseNotes,
mMentorFirstName, mMentorLastName, mMentorEmail, mMentorPhone;
private MentorEntity mMentor;
private Calendar mEndCalendar = Calendar.getInstance();
private Calendar mStartCalendar = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_courses_add);
//initialize the tool bar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
//initialize the view model
mCourseViewModel = new ViewModelProvider(this).get(CourseViewModel.class);
mMentorViewModel = new ViewModelProvider(this).get(MentorViewModel.class);
//initialize EditText views
mCourseTitle = findViewById(R.id.edit_course_add_title);
mCourseStartDate = findViewById(R.id.edit_course_add_start);
mCourseEndDate = findViewById(R.id.edit_course_add_end);
mCourseNotes = findViewById(R.id.edit_course_add_notes);
mMentorFirstName = findViewById(R.id.edit_mentor_add_first);
mMentorLastName = findViewById(R.id.edit_mentor_add_last);
mMentorEmail = findViewById(R.id.edit_mentor_add_email);
mMentorPhone = findViewById(R.id.edit_mentor_add_phone);
try {
loadStartDatePicker();
loadEndDatePicker();
} catch (ParseException e) {
e.printStackTrace();
}
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
saveCourse();
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
private void loadStartDatePicker() throws ParseException {
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mStartCalendar.set(Calendar.YEAR, year);
mStartCalendar.set(Calendar.MONTH, monthOfYear);
mStartCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateStartLabel();
}
};
mCourseStartDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DatePickerDialog(CourseAddActivity.this,date, mStartCalendar.get(Calendar.YEAR), mStartCalendar.get(Calendar.MONTH),
mStartCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
private void updateStartLabel() {
String myFormat = "MM/dd/yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
mCourseStartDate.setText(sdf.format(mStartCalendar.getTime()));
}
private void loadEndDatePicker() throws ParseException {
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mEndCalendar.set(Calendar.YEAR, year);
mEndCalendar.set(Calendar.MONTH, monthOfYear);
mEndCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateEndLabel();
}
};
mCourseEndDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DatePickerDialog(CourseAddActivity.this,date, mEndCalendar.get(Calendar.YEAR), mEndCalendar.get(Calendar.MONTH),
mEndCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
private void updateEndLabel() {
String myFormat = "MM/dd/yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
mCourseEndDate.setText(sdf.format(mEndCalendar.getTime()));
}
private void saveCourse() throws ParseException{
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
verifyMentor();
int termId = getIntent().getIntExtra("termId", 0);
//int mentorId = mMentor.getId();
String title = mCourseTitle.getText().toString();
String status = "Plan to Take";
Date start = formatter.parse(mCourseStartDate.getText().toString());
Date end = formatter.parse(mCourseEndDate.getText().toString());
String notes = mCourseNotes.getText().toString();
CourseEntity course = new CourseEntity(termId, mMentor.getId(), title, status, start, end, notes);
Log.d(TAG, "saveCourse: " + course.getCourse());
mCourseViewModel.saveCourse(course);
onSupportNavigateUp();
}
private void verifyMentor() {
String first = mMentorFirstName.getText().toString();
String last = mMentorLastName.getText().toString();
String phone = mMentorPhone.getText().toString();
String email = mMentorEmail.getText().toString();
mMentor = new MentorEntity(first, last, phone, email);
mMentorViewModel.saveMentor(mMentor);
}
// add support for going back a screen
@Override
public boolean onSupportNavigateUp(){
onBackPressed();
return true;
}
}
package com.example.wguscheduler.entities;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
@Entity (tableName = "mentor_table")
public class MentorEntity {
@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "id")
private long mId;
@ColumnInfo(name = "first_name")
private String mFirstName;
@ColumnInfo(name = "last_name")
private String mLastName;
@ColumnInfo(name = "phone")
private String mPhone;
@ColumnInfo(name = "email")
private String mEmail;
public MentorEntity(long mId, String mFirstName, String mLastName, String mPhone, String mEmail) {
this.mId = mId;
this.mFirstName = mFirstName;
this.mLastName = mLastName;
this.mPhone = mPhone;
this.mEmail = mEmail;
}
@Ignore
public MentorEntity(String mFirstName, String mLastName, String mPhone, String mEmail) {
this.mId = this.mId;
this.mFirstName = mFirstName;
this.mLastName = mLastName;
this.mPhone = mPhone;
this.mEmail = mEmail;
}
public long getId() {
return mId;
}
public void setId(long mId) {
this.mId = mId;
}
public String getFirstName() {
return mFirstName;
}
public void setFirstName(String mFirstName) {
this.mFirstName = mFirstName;
}
public String getLastName() {
return mLastName;
}
public void setLastName(String mLastName) {
this.mLastName = mLastName;
}
public String getPhone() {
return mPhone;
}
public void setPhone(String mPhone) {
this.mPhone = mPhone;
}
public String getEmail() {
return mEmail;
}
public void setEmail(String mEmail) {
this.mEmail = mEmail;
}
public String getMentor() {
String mentor = String.format("\n" +
"\nMentorId: %s\n\r" +
"FirstName: %s\n\r" +
"LastName Id: %s\n\r" +
"Phone: %s\n\r" +
"Email: %s\n\r",
mId, mFirstName, mLastName, mPhone, mEmail);
return mentor;
}
}
package com.example.wguscheduler.dao;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import com.example.wguscheduler.entities.MentorEntity;
import java.util.List;
@Dao
public interface MentorDAO {
//CREATE
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<MentorEntity> mentors);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(MentorEntity mentor);
//READ
@Query("SELECT * FROM mentor_table")
LiveData<List<MentorEntity>> getMentors();
@Query("SELECT * FROM mentor_table WHERE id MATCH :mentorId")
MentorEntity getMentor(long mentorId);
//UPDATE
@Update
void update(MentorEntity mentor);
//DELETE
@Delete
void delete(MentorEntity mentor);
}
package com.example.wguscheduler.viewmodel;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.example.wguscheduler.database.SchedulerRepository;
import com.example.wguscheduler.entities.MentorEntity;
import java.util.ArrayList;
import java.util.List;
public class MentorViewModel extends AndroidViewModel {
private SchedulerRepository mSchedulerRepository;
private LiveData<List<MentorEntity>> mAllMentors;
public MentorViewModel(@NonNull Application application) {
super(application);
mSchedulerRepository = SchedulerRepository.getInstance(application.getApplicationContext());
mAllMentors = mSchedulerRepository.getAllMentors();
}
public LiveData<List<MentorEntity>> getAllMentors(){
return mAllMentors;
}
public void addSampleData(){
mSchedulerRepository.addSampleData();
}
public void saveMentor(MentorEntity mMentor) {
mSchedulerRepository.saveMentor(mMentor);
}
}
package com.example.wguscheduler.database;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;
import androidx.sqlite.db.SupportSQLiteDatabase;
import com.example.wguscheduler.dao.AssessmentDAO;
import com.example.wguscheduler.dao.CourseDAO;
import com.example.wguscheduler.dao.MentorDAO;
import com.example.wguscheduler.dao.TermDAO;
import com.example.wguscheduler.entities.AssessmentEntity;
import com.example.wguscheduler.entities.CourseEntity;
import com.example.wguscheduler.entities.MentorEntity;
import com.example.wguscheduler.entities.TermEntity;
import com.example.wguscheduler.utilities.Converters;
@Database(entities = {TermEntity.class,
AssessmentEntity.class,
CourseEntity.class,
MentorEntity.class},
version = 13)
@TypeConverters({Converters.class})
public abstract class SchedulerDatabase extends RoomDatabase {
public abstract CourseDAO courseDAO();
public abstract MentorDAO mentorDAO();
public abstract TermDAO termDAO();
public abstract AssessmentDAO assessmentDAO();
private static volatile SchedulerDatabase INSTANCE;
static SchedulerDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (SchedulerDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
SchedulerDatabase.class,
"scheduler_database")
.fallbackToDestructiveMigration()
.addCallback(sRoomDatabaseCallback)
.build();
}
}
}
return INSTANCE;
}
//open the database
private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
//new PopulateSchedulerDatabase(INSTANCE).execute();
}
};
}
package com.example.wguscheduler.database;
import android.content.Context;
import android.util.Log;
import androidx.lifecycle.LiveData;
import com.example.wguscheduler.entities.AssessmentEntity;
import com.example.wguscheduler.entities.CourseEntity;
import com.example.wguscheduler.entities.MentorEntity;
import com.example.wguscheduler.entities.TermEntity;
import com.example.wguscheduler.utilities.CourseSampleData;
import com.example.wguscheduler.utilities.MentorSampleData;
import com.example.wguscheduler.utilities.TermSampleData;
import com.example.wguscheduler.utilities.AssessmentSampleData;
import java.text.ParseException;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class SchedulerRepository {
private static final String TAG = "SchedulerRepository";
private static SchedulerRepository mSchedulerRepository;
//data lists
private LiveData<List<TermEntity>> mAllTerms;
private LiveData<List<CourseEntity>> mAllCourses;
private LiveData<List<AssessmentEntity>> mAllAssessments;
private LiveData<List<MentorEntity>> mAllMentors;
private SchedulerDatabase mSchedulerDatabase;
//executor to run only one thread, in order
private Executor executor = Executors.newSingleThreadExecutor();
//singleton creation of the scheduler repository
public static SchedulerRepository getInstance(Context context){
if(mSchedulerRepository == null){
synchronized (SchedulerRepository.class) {
if(mSchedulerRepository == null) {
mSchedulerRepository = new SchedulerRepository(context);
}
}
}
return mSchedulerRepository;
}
private SchedulerRepository(Context context){
mSchedulerDatabase = SchedulerDatabase.getDatabase(context);
mAllTerms = mSchedulerDatabase.termDAO().getTerms();
mAllCourses = mSchedulerDatabase.courseDAO().getCourses();
mAllAssessments = mSchedulerDatabase.assessmentDAO().getAssessments();
mAllMentors = mSchedulerDatabase.mentorDAO().getMentors();
}
//CRUD
//create
public void saveTerm(TermEntity term){
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.termDAO().insertTerm(term);
}
});
}
public void saveCourse(CourseEntity course) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.courseDAO().insertCourse(course);
}
});
}
public void saveMentor(MentorEntity mMentor) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.mentorDAO().insert(mMentor);
}
});
}
public void saveAssessment(AssessmentEntity assessment) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.assessmentDAO().insert(assessment);
}
});
}
public void addSampleData() {
executor.execute(new Runnable(){
@Override
public void run(){
try {
mSchedulerDatabase.termDAO().insertAll(TermSampleData.getTerms());
mSchedulerDatabase.courseDAO().insertAll(CourseSampleData.getCourses());
mSchedulerDatabase.assessmentDAO().insertAll(AssessmentSampleData.getAssessments());
mSchedulerDatabase.mentorDAO().insertAll(MentorSampleData.getMentors());
Log.i(TAG, "addSampleData().run()" + CourseSampleData.getCourses());
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
//read
public LiveData<List<TermEntity>> getAllTerms() {
return mAllTerms;
}
public LiveData<List<CourseEntity>> getAllCourses(){ return mAllCourses;}
public LiveData<List<AssessmentEntity>> getAllAssessments() {
return mAllAssessments;
}
public LiveData<List<MentorEntity>> getAllMentors() {
return mAllMentors;
}
//delete
public void deleteTerm(int termId) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.termDAO().deleteTerm(termId);
}
});
}
public void deleteCourse(int courseId) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.courseDAO().deleteCourse(courseId);
}
});
}
public void deleteAssessment(int assessmentId) {
executor.execute(new Runnable() {
@Override
public void run() {
mSchedulerDatabase.assessmentDAO().deleteAssessment(assessmentId);
}
});
}
}