每当尝试在回收者视图片段中创建新条目时,我都试图将记录插入房间数据库中。要添加新条目,我会在存储库类中观察我的GetTasks方法返回的实时数据,并将添加到我的shows数组的所有新项目添加到存储库中。
问题在于,只要数据更改,onChanged方法似乎就会被调用,因此当我插入数据时,它将再次调用自身。这意味着它将无限地将相同的数据添加到会议室数据库中。
我该如何告诉onChanged方法停止而不自行调用?

我已经尝试了很多方法,但是我想我必须缺少一些内置的方法来防止在网上找不到此方法。

主要活动中的onChanged方法:

ok_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    popupWindow.dismiss();
                    shows.add(new ShowItem(shows.size() + 1, showName.getText().toString()));
                    recyclerView.setAdapter(new MyItemRecyclerViewAdapter(shows));
                    mAdapter.notifyDataSetChanged();
                    final ShowRepository showRepository = new ShowRepository(getApplicationContext());

                    showRepository.getTasks().observe(test, new Observer<List<Show>>() {
                        @Override
                        public void onChanged(@Nullable List<Show> sections) {
                            for (ShowItem i : shows) {
                                showRepository.insertTask(i.getName());

                            }
                        }
                    });

                }
            });


DaoAccess:

@Dao
public interface DaoAccess {

    @Insert
    Long insertTask(Show show);


    @Query("SELECT * FROM Show ORDER BY id desc")
    LiveData<List<Show>> fetchAllTasks();


    @Query("SELECT * FROM Show WHERE id =:taskId")
    LiveData<Show> getTask(int taskId);


    @Update
    void updateTask(Show Show);


    @Delete
    void deleteTask(Show Show);


表演班:

@Entity
public class Show {
    @PrimaryKey(autoGenerate = true)
    private int id;

    private String name;


    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


在存储库中插入任务:

 public void insertTask(String name) {
        Show show = new Show();
        show.setName(name);
        insertTask(show);
    }

    public static void insertTask(final Show show) {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... voids) {
                showDatabase.daoAccess().insertTask(show);
                return null;
            }
        }.execute();
    }

最佳答案

如果有兴趣的人将其用于onChanged,则可以修复此问题:

 @Override
                    public void onChanged(@Nullable List<Show> sections) {
                        if (!hascalled) {
                            for (ShowItem i : shows) {
                                int count = 0;
                                for (Show s : sections) {
                                    if (i.getName().equals(s.getName())) {
                                        count++;
                                    }
                                }
                                if (count == 0) {
                                    showRepository.insertTask(i.getName());

                                }

                            }
                            hascalled = true;
                        }

                    }

09-26 21:48