Java 使用多个子键重命名firebase中的键
我有一个活动,允许用户更改其UserPIN(考勤记录表下的即时键),并且我已经了解到,除了再次删除和添加更新数据外,没有其他方法更新Firebase实时数据库。我的问题是我必须更新表中的键,但它有多个子键和大量数据。如何访问子密钥并存储它们?数据更新不会花费很多时间吗 假设我必须更新密钥:123452 考勤记录表 除了我在下面尝试过的方法之外,如果还有其他方法,我会洗耳恭听的 编辑 我已达到通过以下方式从考勤记录表中检索数据的水平:Java 使用多个子键重命名firebase中的键,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个活动,允许用户更改其UserPIN(考勤记录表下的即时键),并且我已经了解到,除了再次删除和添加更新数据外,没有其他方法更新Firebase实时数据库。我的问题是我必须更新表中的键,但它有多个子键和大量数据。如何访问子密钥并存储它们?数据更新不会花费很多时间吗 假设我必须更新密钥:123452 考勤记录表 除了我在下面尝试过的方法之外,如果还有其他方法,我会洗耳恭听的 编辑 我已达到通过以下方式从考勤记录表中检索数据的水平: rootRefAttTable = FirebaseData
rootRefAttTable = FirebaseDatabase.getInstance()
.getReference("Attendance_Records")
.child(carriedmPIN);
newRefAttTable = FirebaseDatabase.getInstance()
.getReference("Attendance_Records");
attRec = new Attendance_Records();
然后
但是,添加到数据库的方式与它应该的方式不同:
之前
之后
很抱歉更新前的图像。更新后(123450到123459),第3个月和第4个月合并在一起,目前我没有2年的时间(假设是2018年和2019年),否则我认为他们也会加入。我如何纠正这个错误?< p>我猜这里的问题是,<代码> MunthKEY <代码>是常见的,如果我正确的话,它是<强> 04 < /强>,所以默认情况下,FixBASE把它看成是同一个孩子,并将所有的东西都添加到 但是回到主要问题,更改pin,您是否尝试过以下方法: 编辑: 您为什么不使用Firebase为添加的每个孩子提供的唯一id更改数据库的结构,并将其用作密钥,然后在孩子中为pin添加一个字段 这将首先确保您的所有孩子在以后不会发生冲突,如果您有使用公共PIN的用户,第二,它将使在临时对象上检索整个用户对象变得更容易,更改其中的PIN值,然后使用提供的唯一id再次将其推送到同一个孩子 如果您想知道如何获取此唯一id,我还建议将其保存为对象中的字段,在推送对象时保存,并在需要时从检索到的临时对象中检索 处理这一切的最佳方法是通过
onchildaded
和onChildChanged
方法,而不是手动(提示:尝试将数据库拆分为不同的引用,这将使您更容易管理ChildListener
)我终于做到了
有时,您需要更深入的逻辑,但所需的只是一个简单的代码
我是这样做的:
rootRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records").child(carriedmPIN);
newRefAttTable = FirebaseDatabase.getInstance().getReference("Attendance_Records");
CarriedPIN是用户需要更改的PIN
private void changeAttTable() {
Log.d("abcd","changeAttTable() reached");
rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
for(DataSnapshot monthsnap:yearsnap.getChildren()){
for(DataSnapshot datesnap:monthsnap.getChildren()){
dateAtt = datesnap.child("date").getValue(String.class);
Log.d("abcd","date is: "+dateAtt);
entrydateAtt = datesnap.child("entryDate").getValue(String.class);
Log.d("abcd","enteryDate is: "+entrydateAtt);
intimeAtt = datesnap.child("inTime").getValue(String.class);
Log.d("abcd","inTime is: "+intimeAtt);
monthAtt = datesnap.child("month").getValue(String.class);
Log.d("abcd","month is: "+monthAtt);
myidAtt = datesnap.child("myID").getValue(String.class);
Log.d("abcd","myID is: "+myidAtt);
outtimeAtt = datesnap.child("outTime").getValue(String.class);
Log.d("abcd","outTime is: "+outtimeAtt);
statusAtt = datesnap.child("status").getValue(String.class);
Log.d("abcd","status is: "+statusAtt);
yearAtt = datesnap.child("year").getValue(String.class);
Log.d("abcd","year is: "+yearAtt);
getValuesAtt();
newRefAttTable.child(enterednewmpin).child(yearsnap.getKey()).child(monthsnap.getKey()).child(datesnap.getKey()).setValue(attRec);
}
}
}
newRefAttTable.child(carriedmPIN).removeValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getValuesAtt(){
Log.d("abcd","getValuesAtt() reached");
attRec.setYear(yearAtt);
attRec.setMonth(monthAtt);
attRec.setMyID(myidAtt);
attRec.setEntryDate(entrydateAtt);
attRec.setStatus(statusAtt);
attRec.setOutTime(outtimeAtt);
attRec.setInTime(intimeAtt);
attRec.setDate(dateAtt);
}
我太高兴了!!很长一段时间以来,我一直被困在这个问题上!!:P我认为直接使用setValue不会起作用,因为它最多只能重命名我的密钥,所有子项都将被删除。是的,我刚刚检查了它,我确信有一种方法可以改变特定的值,或者改变数据库结构,比如将pin保存为对象中的字段?嘿!我之前检查过,在Firebase中无法重命名任何内容,我们需要删除并重新设置该值。对于不太复杂的数据库来说,这很容易做到,但我的数据库有多个级别:/I我不能更改数据库结构,因为根据这个PIN,我只允许用户每月查看他们的出勤情况。[这个视频系列]()应该澄清这样一个想法,即当涉及到NoSQL数据库时,您需要转向扁平结构,希望它能有所帮助!然而,在您的情况下,如果您坚持按原样保存结构,我想通过添加PIN字段并使用Firebase提供的密钥,您可以在
onchildadded
中提取PIN和密钥列表,然后通过用户输入PIN,您可以使用链接到它的密钥从DB中获取对象。(不过我想你还是需要考虑一下PIN复制)
private void changeAttTable() {
Log.d("abcd","changeAttTable() reached");
rootRefAttTable.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot yearsnap:dataSnapshot.getChildren()){
for(DataSnapshot monthsnap:yearsnap.getChildren()){
for(DataSnapshot datesnap:monthsnap.getChildren()){
dateAtt = datesnap.child("date").getValue(String.class);
Log.d("abcd","date is: "+dateAtt);
entrydateAtt = datesnap.child("entryDate").getValue(String.class);
Log.d("abcd","enteryDate is: "+entrydateAtt);
intimeAtt = datesnap.child("inTime").getValue(String.class);
Log.d("abcd","inTime is: "+intimeAtt);
monthAtt = datesnap.child("month").getValue(String.class);
Log.d("abcd","month is: "+monthAtt);
myidAtt = datesnap.child("myID").getValue(String.class);
Log.d("abcd","myID is: "+myidAtt);
outtimeAtt = datesnap.child("outTime").getValue(String.class);
Log.d("abcd","outTime is: "+outtimeAtt);
statusAtt = datesnap.child("status").getValue(String.class);
Log.d("abcd","status is: "+statusAtt);
yearAtt = datesnap.child("year").getValue(String.class);
Log.d("abcd","year is: "+yearAtt);
getValuesAtt();
newRefAttTable.child(enterednewmpin).child(yearsnap.getKey()).child(monthsnap.getKey()).child(datesnap.getKey()).setValue(attRec);
}
}
}
newRefAttTable.child(carriedmPIN).removeValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getValuesAtt(){
Log.d("abcd","getValuesAtt() reached");
attRec.setYear(yearAtt);
attRec.setMonth(monthAtt);
attRec.setMyID(myidAtt);
attRec.setEntryDate(entrydateAtt);
attRec.setStatus(statusAtt);
attRec.setOutTime(outtimeAtt);
attRec.setInTime(intimeAtt);
attRec.setDate(dateAtt);
}