Сохранение данных обратно в БД с помощью ViewModel и LiveData - PullRequest
0 голосов
/ 21 ноября 2019

Я хочу реализовать 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?

1 Ответ

0 голосов
/ 21 ноября 2019

вы хотите что-то подобное

вам не нужно обновление, потому что ваша вставка уже работает как обновление

Executor executor = Executors.newSingleThreadExecutor();
RoomDatabase db = Room.databaseBuilder(application,
            AppDatabase.class, "MyDatabase")
            .build();

public void savePerson() {
    executor.execute(new Runnable() {
        @Override
        public void run() {
            db.personDao().insert(person.value);
        }
    });
}
...