我有一个活动,我允许用户更改他的UserPIN(Attendance_Records表下的直接键),我已经读过除了删除和添加更新数据之外没有其他方法可以更新Firebase实时数据库再次。我的问题是我必须更新一个表,我想要更新其键,但它有多个子键和大量数据。如何访问子键并存储它们?不希望数据更新需要花费很多时间吗?我还有其他方法吗?
修改
我已经达到了能够通过使用以下方式从Attendance_Records表中检索数据的级别:
rootRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records").child(carriedmPIN);
newRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records");
attRec = new Attendance_Records();
然后
private void changeAttTable(){
Log.d("abcd","changeAttTable() reached");
rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
yearKey = yearsnap.getKey();
Log.d("abcd","yearKey is: "+yearKey);
monthkeyRef = rootRefAttTable.child(yearKey);
monthkeyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot monthsnap:dataSnapshot.getChildren()){
monthKey = monthsnap.getKey();
datekeyRef = monthkeyRef.child(monthKey);
datekeyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot datesnap:dataSnapshot.getChildren()){
dateKey = datesnap.getKey();
date = datesnap.child("date").getValue(String.class);
enteryDate = datesnap.child("entryDate").getValue(String.class);
inTime = datesnap.child("inTime").getValue(String.class);
month = datesnap.child("month").getValue(String.class);
myID = datesnap.child("myID").getValue(String.class);
outTime = datesnap.child("outTime").getValue(String.class);
status = datesnap.child("status").getValue(String.class);
year = datesnap.child("year").getValue(String.class);
addDataAttTable();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getValuesAtt(){
Log.d("abcd","getValuesAtt() reached");
attRec.setYear(year);
attRec.setMonth(month);
attRec.setMyID(myID);
attRec.setEntryDate(enteryDate);
attRec.setStatus(status);
attRec.setOutTime(outTime);
attRec.setInTime(inTime);
attRec.setDate(date);
}
private void addDataAttTable(){
Log.d("abcd","addDataAttTable() reached");
getValuesAtt();
newRefAttTable.child(carriedmPIN).removeValue();
newRefAttTable.child(enterednewmpin).child(yearKey).child(monthKey).child(dateKey).setValue(attRec);
}
对于更新前的图片感到抱歉。 更新后(123450到123459),第3个月和第4个月连在一起,现在我没有2年(2018年和2019年假设),否则我认为他们也会加入。我怎么能纠正这个?
答案 0 :(得分:0)
我想我知道你要做什么。 Firebase没有通过更新“重命名”路径的一部分的概念。相反,您必须完全删除现有节点并重新创建它。它将在很短的时间内完成,因此您不会收到通知,表示您已删除并添加了一个完整的新节点。
步骤1:通过将现有对象检索为模型来复制现有对象。
第2步:使用所需的更新名称创建一个新的孩子。
第3步:使用ref.setValue(model);
第4步:使用ref.removeValue();
或ref.setValue(null);