要在ViewModel中观察数据库的更改,可以使用Android Jetpack组件中的LiveData和Room来实现。以下是一个示例解决方案的代码示例:
MyRepository
:public class MyRepository {
private MyDao myDao;
private LiveData> myEntities;
public MyRepository(Application application) {
MyDatabase db = MyDatabase.getInstance(application);
myDao = db.myDao();
myEntities = myDao.getAllMyEntities();
}
public LiveData> getAllMyEntities() {
return myEntities;
}
public void insertMyEntity(MyEntity myEntity) {
new InsertAsyncTask(myDao).execute(myEntity);
}
private static class InsertAsyncTask extends AsyncTask {
private MyDao asyncTaskDao;
InsertAsyncTask(MyDao dao) {
asyncTaskDao = dao;
}
@Override
protected Void doInBackground(final MyEntity... params) {
asyncTaskDao.insert(params[0]);
return null;
}
}
}
MyViewModel
:public class MyViewModel extends AndroidViewModel {
private MyRepository repository;
private LiveData> myEntities;
public MyViewModel(@NonNull Application application) {
super(application);
repository = new MyRepository(application);
myEntities = repository.getAllMyEntities();
}
public LiveData> getAllMyEntities() {
return myEntities;
}
public void insertMyEntity(MyEntity myEntity) {
repository.insertMyEntity(myEntity);
}
}
MyActivity
:public class MyActivity extends AppCompatActivity {
private MyViewModel myViewModel;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
myViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(MyViewModel.class);
myAdapter = new MyAdapter();
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myAdapter);
myViewModel.getAllMyEntities().observe(this, new Observer>() {
@Override
public void onChanged(List myEntities) {
myAdapter.setMyEntities(myEntities);
}
});
// 插入一个新的实体
MyEntity newEntity = new MyEntity("Example");
myViewModel.insertMyEntity(newEntity);
}
}
这个示例中,MyRepository
负责与数据库进行交互,MyViewModel
用于将数据提供给Activity或Fragment,并观察数据库更改。当数据库中的数据发生变化时,MyViewModel
会通知观察者(在这里是Activity或Fragment),然后更新UI。