【问题标题】:Room only prints the first line房间只打印第一行
【发布时间】:2020-08-16 17:11:00
【问题描述】:

我正在编写一个简单的应用程序,它使用 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;
    }
}

笔记道

@Dao
public interface NoteDao {

    @Insert
    void insert(Note note);

    @Delete
    void delete(Note note);

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

}

应用数据库

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

数据管理器

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

主活动

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 LinearLayoutManager(this, LinearLayoutManager.VERTICAL, 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

保存笔记视图

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

保存NotePresenter

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

添加笔记活动

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, message, Snackbar.LENGTH_SHORT).show();
    }
}

【问题讨论】:

  • insertNote 在哪里调用?
  • @MerthanE 添加

标签: android android-recyclerview android-room


【解决方案1】:

很可能只有 1 个 id 一直被替换(如果不是这种情况,请检查插入的频率)

我将 Kotlin 与 Room 一起使用,但在 this official example 他们有一个公共的自动生成的主键,Room 可能需要它来访问它并自动生成它。所以把变量公开,看看它是否有效

【讨论】:

    【解决方案2】:

    没有问题。我刚刚在全屏中指定了 item_list 的父布局。因此,后面的那些是不可见的。愚蠢的错误:D

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多