房间只打印第一行

问题描述

我正在编写一个简单的应用程序,该应用程序使用 Room 数据库中存储2个字符串值(我正在尝试学习该库)。因此,我的名单上只有一行。首次提出。其余的不显示。这种行为的原因是什么?

型号

@Entity
public class Note {

    @PrimaryKey(autoGenerate = true)
    private long id;
    private String title;
    private String text;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

NoteDao

@Dao
public interface NoteDao {

    @Insert
    void insert(Note note);

    @Delete
    void delete(Note note);

    @Query("SELECT * FROM Note")
    List<Note> getAllNotes();

}

AppDatabase

@Database(entities = Note.class,version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract NoteDao getNoteDao();
}

DataManager

public class DataManager {

    private AppDatabase appDatabase;

    public DataManager (AppDatabase appDatabase) {
        this.appDatabase = appDatabase;
    }

    public List <Note> getNotes () {
        try {
            return new GetNotes (). execute (). get ();
        } catch (ExecutionException | InterruptedException e) {
            e.printstacktrace ();
            return null;
        }
    }

    public void insertNote (Note note) {
        new InsertNote (note) .execute ();
    }

    public void deleteNote (Note note) {
        new DeleteNote (note) .execute ();
    }


    // Get all notes
    public class GetNotes extends AsyncTask <Void,Void,List <Note>> {

        @Override
        protected List <Note> doInBackground (Void ... voids) {
            return appDatabase.getNoteDao (). getAllNotes ();
        }
    }

    // Insert note
    public class InsertNote extends AsyncTask <Void,Void> {

        private Note note;

        InsertNote (Note note) {
            this.note = note;
        }

        @Override
        protected Void doInBackground (Void ... voids) {
            appDatabase.getNoteDao (). insert (note);
            return null;
        }
    }

    // Delete note
    public class DeleteNote extends AsyncTask <Void,Void> {

        private Note note;

        public DeleteNote (Note note) {
            this.note = note;
        }

        @Override
        protected Void doInBackground (Void ... voids) {
            appDatabase.getNoteDao (). delete (note);
            return null;
        }
    }
}

Mvp

public interface NoteListView extends MvpView {
    void showNoteList(List<Note> note);
}

演示者

public class NoteListPresenter extends MvpPresenter<NoteListView> {

    private DataManager dataManager;

    public NoteListPresenter(DataManager dataManager) {
        this.dataManager = dataManager;
    }

    public void getNotes(){
        getView().showNoteList(dataManager.getNotes());
    }

    public void deleteNote(Note note) {
        dataManager.deleteNote(note);
        getView().showNoteList(dataManager.getNotes());
    }
}

适配器

public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> {

    private List<Note> listNote;
    private Context context;

    public NoteAdapter(Context context,List<Note> listNote) {
        this.listNote = listNote;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder,int position) {
        holder.title.setText(listNote.get(position).getTitle());
        holder.text.setText(listNote.get(position).getText());
    }

    @Override
    public int getItemCount() {
        return listNote.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView title,text;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.title);
            text = itemView.findViewById(R.id.text);
        }
    }
}

MainActivity

public class MainActivity extends AppCompatActivity implements NoteListView {

    private NoteListPresenter presenter;
    private RecyclerView recyclerView;
    private NoteAdapter noteAdapter;
    private ConstraintLayout constraintLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        constraintLayout = findViewById(R.id.coordinatorMain);

        recyclerView = findViewById(R.id.recycler);
        recyclerView.setLayoutManager(new @R_502_609@(this,@R_502[email protected],false));

        presenter = new NoteListPresenter(App.getDataManager());
        presenter.attachView(this);
        presenter.getNotes();
    }

    public void onNextActivity(View view){
        startActivity(new Intent(MainActivity.this,AddNoteActivity.class));
    }

    @Override
    public void showNoteList(List<Note> note) {
        noteAdapter = new NoteAdapter(this,note);
        recyclerView.setAdapter(noteAdapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.getNotes();
    }

    @Override
    public void showMessage(String message) {
        Snackbar.make(constraintLayout,message,Snackbar.LENGTH_SHORT).show();
    }
}

UPD

SaveNoteView

public interface SaveNoteView extends MvpView {
    void insertNote(Note note);
}

SaveNotePresenter

public class SaveNotePresenter extends MvpPresenter<SaveNoteView> {

    private DataManager dataManager;

    public SaveNotePresenter(DataManager dataManager) {
        this.dataManager = dataManager;
    }

    public void insertNote(Note note){
        dataManager.insertNote(note);
        getView().insertNote(note);
    }
}

AddNoteActivity

public class AddNoteActivity extends AppCompatActivity implements SaveNoteView {

    private TextInputEditText title,text;
    private ConstraintLayout constraintLayout;
    private SaveNotePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_note);

        constraintLayout = findViewById(R.id.constrainAdd);

        title = findViewById(R.id.titleEditText);
        text = findViewById(R.id.textEditText);

        presenter = new SaveNotePresenter(App.getDataManager());
        presenter.attachView(this);
    }

    //Save a note
    public void saveNote(View view){

        Note note = new Note();
        note.setTitle(title.getText().toString());
        note.setText(text.getText().toString());

        presenter.insertNote(note);
        finish();
    }

    @Override
    public void insertNote(Note note) {
        DataManager dataManager = App.getDataManager();
        dataManager.insertNote(note);
    }

    @Override
    public void showMessage(String message) {
        Snackbar.make(constraintLayout,Snackbar.LENGTH_SHORT).show();
    }
}

解决方法

很可能在整个过程中只有1个ID被蜜蜂替换(如果不是这种情况,请检查插入频率)

我将Kotlin与Room一起使用,但是在this official example中,他们有一个公共的自动生成的primaryKey,Room可能需要它来访问它并自动生成它。因此,将变量设为public,看看它是否有效

,

没有问题。我只是在全屏模式下为 item_list 指定了父级布局。因此,后续的不可见。愚蠢的错误:D