每当尝试在回收者视图片段中创建新条目时,我都试图将记录插入房间数据库中。要添加新条目,我会在存储库类中观察我的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;
}
}