我的数据看起来像这样
我只想在索引3处添加一个对象。我怎么能在那里添加它。有没有办法在没有迭代的情况下添加一个对象,或者我必须迭代和getChildCount然后追加新的子(“3”)及其数据。
TransGenderBO transGenderBO = new TransGenderBO();
transGenderBO.setName("pushName");
transGenderBO.setAge(13);
mRef.child("").setValue(transGenderBO);
mRef中没有方法可以获取子计数并在3位添加新项目。
使用Frank代码后编辑但仍无法正常工作
Query last = mRef.orderByKey().limitToLast(1);
last.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int lastIndex = 0;
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
lastIndex = Integer.parseInt(childSnapshot.getKey());
}
TransGenderBO transGenderBO = new TransGenderBO();
transGenderBO.setName("pushName");
transGenderBO.setAge(13);
mRef.child(""+(lastIndex+1)).setValue(transGenderBO);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(mContext,databaseError.getMessage(),Toast.LENGTH_LONG).show();
}
});
答案 0 :(得分:1)
Firebase documentation和blog建议不要在数据库中使用数组:对于用户可以脱机的多用户应用程序,它们不能很好地工作。
要在此处向阵列添加下一个元素,您必须至少下载数组的最后一个元素以了解下一个元素的索引:
Query last = root.orderByKey().limitToLast(1);
last.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int lastIndex;
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
lastIndex = Integer.parseInt(childSnapshot.getKey());
}
root.child(""+(lastIndex+1)).setValue(true);
}
但这具有固有的竞争条件。当多个用户同时向阵列添加元素时,他们最终可能会写入相同的索引。
为了防止这种情况,你可以use a Firebase transaction。通过此操作,您可以从某个位置获取当前值,并在交换中返回您在该位置所需的新值。这可确保用户之间不会覆盖任何数据,但这意味着您必须下载整个阵列。
当用户未连接到网络时,这些方案都不起作用。
Firebase建议使用所谓的推送ID,其中包括:
唯一的缺点是它们不像数组索引那么容易读取。
答案 1 :(得分:0)
获取此类数据
private ArrayList<TransGenderBO> transGenderBO;
FirebaseDatabase.getInstance().getReference().child("Main")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
transGenderBO = (ArrayList<TransGenderBO>) dataSnapshot.getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
并设置您的值
TransGenderBO transGender = new TransGenderBO();
transGender.setName("pushName");
transGender.setAge(13);
FirebaseDatabase.getInstance().getReference().child("Main").child(String.valueOf(transGenderBO.size())).setValue(transGender);
或U也可以这样设置
TransGenderBO transGender = new TransGenderBO();
transGender.setName("pushName");
transGender.setAge(13);
TransGenderBO.add(transGender);
FirebaseDatabase.getInstance().getReference().child("Main")
.setValue(transGenderBO);