Я хочу реализовать Android-активность для обновления записи в базе данных.
Вот мой MainActivity. Макет имеет кнопку, текстовое представление и текст редактирования. Деятельность получает свои данные из ViewModel, наблюдая за человеком. После того, как пользователь отредактировал текст в поле editText, я хочу сохранить Person обратно в базу данных.
public class MainActivity extends AppCompatActivity {
private MainViewModel viewModel;
private TextView text;
private EditText editText;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
text = findViewById(R.id.textView);
editText = findViewById(R.id.editText);
viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
viewModel.getPerson().observe(this, new Observer<Person>() {
@Override
public void onChanged(Person person) {
text.setText(person.getName());
editText.setText(person.getName());
}
});
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
//Save person?
viewModel.savePerson();
}
});
}
}
ViewModel это:
public class MainViewModel extends AndroidViewModel {
private LiveData<Person> person;
private AppDatabase db;
public MainViewModel(@NonNull Application application) {
super(application);
db = Room.databaseBuilder(application,
AppDatabase.class, "MyDatabase")
.build();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
@Override
public void run() {
db.personDao().insert(new Person(42, "Arthur Dent"));
}
});
person = db.personDao().loadById(42);
}
public LiveData<Person> getPerson(){
return person;
}
public void savePerson() {
}
}
Это PersonDao иСущность Person:
@Dao
interface PersonDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(Person person);
@Query("SELECT * FROM Person WHERE id=:id")
LiveData<Person> loadById(long id);
}
@Entity
public class Person {
@PrimaryKey
long id;
String name;
public Person(long id, String name) {
this.id = id;
this.name = name;
}
// getters and setters
}
ViewModel получает объект LiveData из базы данных. Активность подписывается на него и может разместить его содержимое на дисплее. Как я могу сохранить любые изменения, сделанные пользователем?
Единственный способ увидеть это - прочитать поля формы, создать новый пользовательский объект и сохранить его обратно в базу данных. Возможно ли для представления сохранить изменения непосредственно в объекте LiveData?