[英]Firebase - Why is list size always 0 (when trying to add key to list inside event listener)
我正在尝试在我的数据库中存储多个位置列表。 我希望键遵循一种模式,例如“LocationList 1”、“LocationList 2”等。
为此,我创建了一个列表来保存所有键。 首先,我想检查数据库中是否有任何孩子。 如果没有,我想添加一个名为“LocationList 1”的孩子并将该字符串存储在我的列表中。 如果已经有一个具有该名称的孩子(意味着我的列表大小不是 0),那么我想添加一个名为“LocationList <此处列表中的项目数 + 1>”的键。 但是我的逻辑中的某些东西是错误的,因为列表大小始终为 0。
这是我检索所有密钥的方法:
private void getKeysList() {
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(snapshot.hasChildren()) {
locationKeysString.add(snapshot.getKey());;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
这是我将位置列表添加到数据库的方法:
public Task<Void> addLocation(List<Location> locationList, Context context) {
getKeysList();
int itemNumber = locationKeysString.size();
String keyValue = new String();
Task<Void> task;
if (itemNumber == 0) {
keyValue = "LocationList " + 1;
locationKeysString.add(keyValue);
task = databaseReference
.child(keyValue)
.setValue(locationList)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(context, R.string.add_to_database_success, Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, R.string.add_to_database_failure, Toast.LENGTH_SHORT).show();
}
});
} else {
keyValue = "LocationList " + (itemNumber + 1);
locationKeysString.add(keyValue);
task = databaseReference
.child(keyValue)
.setValue(locationList)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(context, R.string.add_to_database_success, Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, R.string.add_to_database_failure, Toast.LENGTH_SHORT).show();
}
});
}
return task;
}
但是当我运行我的应用程序时,它会不断将位置添加到数据库中的单个位置列表“LocationList 1”中:
永远不会创建“LocationList 2”。
我还尝试了以下方法:
private void getKeysList() {
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
locationKeysString.add(snapshot.getKey());
}
[...]);
}
但列表大小仍为 0。
我究竟做错了什么? 除此之外,有什么方法可以改进我的代码吗?
谢谢你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.