我正在学习MVVM和使用Room和Viewmodel的教程。我手动插入了一些项目到数据库中,它应该用这些项目更新RecyclerView。但是,当我运行它时,连接到适配器的arrayList显示为0。我不确定我哪里出错了,因为我遵循了教程,但是在检查了几次步骤后,我仍然卡住了
主要活动:
public class MainActivity extends AppCompatActivity {
private NoteViewModel noteViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
NoteAdapter noteAdapter = new NoteAdapter();
recyclerView.setAdapter(noteAdapter);
noteViewModel = new ViewModelProvider(this).get(NoteViewModel.class);
//noteViewModel = new ViewModelProvider(this).get(NoteViewModel.class);
noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() {
@Override
public void onChanged(List<Note> notes) {
noteAdapter.setNotes(notes);
Toast.makeText(MainActivity.this, "onChanged", Toast.LENGTH_SHORT).show();
}
});
}
视图模型:
public class NoteViewModel extends AndroidViewModel {
private NoteRepository repository;
private LiveData<List<Note>> allNotes;
public NoteViewModel(@NonNull Application application) {
super(application);
repository = new NoteRepository(application);
allNotes = repository.getAllNotes();
}
public void insert(Note note){
repository.insert(note);
}
public void update(Note note){
repository.update(note);
}
public void delete(Note note){
repository.delete(note);
}
public void deleteAllNotes(){
repository.deleteAllNotes();
}
public LiveData<List<Note>> getAllNotes() {
return allNotes;
}
}
存储库:
public class NoteRepository {
private NoteDao noteDao;
private LiveData<List<Note>> allNotes;
public NoteRepository(Application application){
NoteDatabase database = NoteDatabase.getInstance(application);
noteDao = database.noteDao();
allNotes = noteDao.getAllNotes();
}
public void insert(Note note){
new InsertNoteAsyncTask(noteDao).execute(note);
}
public void update(Note note){
new UpdateNoteAsyncTask(noteDao).execute(note);
}
public void delete(Note note){
new DeleteNoteAsyncTask(noteDao).execute(note);
}
public void deleteAllNotes(){
new DeleteAllNotesAsyncTask(noteDao).execute();
}
public LiveData<List<Note>> getAllNotes(){
return allNotes;
}
private static class InsertNoteAsyncTask extends AsyncTask<Note, Void, Void>{
private NoteDao noteDao;
private InsertNoteAsyncTask(NoteDao noteDao){
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
noteDao.insert(notes[0]);
return null;
}
}
private static class UpdateNoteAsyncTask extends AsyncTask<Note, Void, Void>{
private NoteDao noteDao;
private UpdateNoteAsyncTask(NoteDao noteDao){
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
noteDao.update(notes[0]);
return null;
}
}
private static class DeleteNoteAsyncTask extends AsyncTask<Note, Void, Void>{
private NoteDao noteDao;
private DeleteNoteAsyncTask(NoteDao noteDao){
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Note... notes) {
noteDao.delete(notes[0]);
return null;
}
}
private static class DeleteAllNotesAsyncTask extends AsyncTask<Void, Void, Void>{
private NoteDao noteDao;
private DeleteAllNotesAsyncTask(NoteDao noteDao){
this.noteDao = noteDao;
}
@Override
protected Void doInBackground(Void... voids) {
noteDao.deleteAllNotes();
return null;
}
}
}
适配器:
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.MyViewHolder> {
private List<Note> notes = new ArrayList<>();
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.note_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
Note currentNote = notes.get(position);
holder.tvTitle.setText(currentNote.getTitle());
holder.tvDescription.setText(currentNote.getDescription());
holder.tvPriority.setText(String.valueOf(currentNote.getPriority()));
}
@Override
public int getItemCount() {
return notes.size();
}
public void setNotes(List<Note> notes){
this.notes = notes;
notifyDataSetChanged();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
private TextView tvTitle;
private TextView tvDescription;
private TextView tvPriority;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tvTitle = itemView.findViewById(R.id.tvTitle);
tvDescription = itemView.findViewById(R.id.tvDescription);
tvPriority = itemView.findViewById(R.id.tvPriority);
}
}
数据库类:
@Database(entities = {Note.class}, version = 1)
public abstract class NoteDatabase extends RoomDatabase {
private static NoteDatabase instance;
public abstract NoteDao noteDao();
public static synchronized NoteDatabase getInstance(Context context){
if(instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(),
NoteDatabase.class, "note_database")
.fallbackToDestructiveMigration()
.addCallback(roomCallback)
.build();
}
return instance;
}
private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback(){
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
new PopulateDbAsyncTask(instance).execute();
}
};
private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void>{
private NoteDao noteDao;
public PopulateDbAsyncTask(NoteDatabase db){
noteDao = db.noteDao();
}
@Override
protected Void doInBackground(Void... voids) {
noteDao.insert(new Note("Title 1", "Description 1", 1));
noteDao.insert(new Note("Title 2", "Description 2", 2));
noteDao.insert(new Note("Title 3", "Description 3", 3));
return null;
}
}
道:
@Dao
public interface NoteDao {
@Insert
void insert(Note note);
@Update
void update(Note note);
@Delete
void delete(Note note);
@Query("DELETE FROM note_table")
void deleteAllNotes();
@Query("SELECT * FROM note_table ORDER BY priority DESC") // '*' means all columns
LiveData<List<Note>> getAllNotes();
}
感谢您的任何意见
您的问题很可能是您在没有onCreate回调中的代码的情况下运行了应用程序,或者在onCreate回调中使用了失败的代码。回调仅在数据库创建后运行。数据库创建后,除非被删除,否则不会再次调用onCreate。
最简单的选择是删除数据库(最简单的方法是卸载应用程序),然后运行应用程序,然后运行onCreate回调。