我想实现一个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对象?
答案 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);
}
});
}