使用ViewModel和LiveData将数据保存回数据库

时间:2019-11-21 10:41:18

标签: android android-room android-livedata android-viewmodel

我想实现一个Android活动来更新数据库中的条目。

这是我的MainActivity。布局具有一个按钮,一个文本视图和一个编辑文本。 Activity通过观察Person从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 :(得分:0)

您想要类似的东西

您不需要更新,因为您插入的内容就像已经更新一样

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);
        }
    });
}