Когда ребенок добавляется или удаляется в базе данных реального времени Firebase, я получаю строку списка дубликатов. Дубликат - это старая строка, когда добавляется новый дочерний элемент. Что бы это было?
Я избегаю прямого доступа к целевому дочернему элементу, так как планирую получить больше данных из разных частей, поэтому перебираю datasnapshot. Я думал, что это будет лучший вариант в моем случае.
Дочерний объект DataSnapshot: dataSnapshot.getChildren ()
Это то, что я планирую:
Os osData = child.child("StaticData").child("os").getValue(Os.class);
Ram ramData = child.child("StaticData")..child("RAM").getValue(Ram.class)
...
...
Вот код.
public class HomeActivity extends AppCompatActivity {
private static final String TAG = "HomeActivity";
SharedPreferences sharedPref;
private String uid;
private DatabaseReference databaseReference;
private RelativeLayout emptyListPlaceHolder;
List<Os> myList = new ArrayList<>();
RecyclerView rv;
HomeAdapter homeAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
rv = findViewById(R.id.recycler_view);
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.keepSynced(true);
emptyListPlaceHolder = findViewById(R.id.home_activity_empty_placeholder);
getSharedPref(); // Gets uid
getHomeData();
}
private void getHomeData() {
DatabaseReference userStatsRef = databaseReference.child("stats").child(uid);
userStatsRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int i = 0;
emptyListPlaceHolder.setVisibility(View.GONE);
for (DataSnapshot child : dataSnapshot.getChildren()) {
Os osData = child
.child("StaticData")
.child("os")
.getValue(Os.class);
myList.add(i, osData);
i++;
} // END for loop
rv.setVisibility(View.VISIBLE);
rv.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
rv.setHasFixedSize(false);
homeAdapter = new HomeAdapter(myList);
rv.setAdapter(homeAdapter);
} // END onDataChange
@Override
public void onCancelled(DatabaseError error) {
Log.w(TAG, "Failed to read value.", error.toException());
}
});
}
}