在此代码中,仅对最后一项(9个项目中)执行写入数据库的操作。 代码中的所有日志都能正常显示...对于所有项目,翻译都会正确执行并返回到日志中。 除最后一项外,不执行仅写入Firebase数据库的操作。这与从翻译器代码中调用updatechildern有关吗?
myRef
.limitToFirst(1)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
final Iterator<DataSnapshot> iterator1 = dataSnapshot.getChildren().iterator();
do {
DataSnapshot ds = iterator1.next();
iteratorkey = ds.getKey();
Log.e(TAG, "Current key is : " + iteratorkey);
Iterator<DataSnapshot> iterator2 = ds.getChildren().iterator();
do {
item = iterator2.next().getValue(Item.class);
englishArabicTranslator.translate(item.getLang())
.addOnSuccessListener(
new OnSuccessListener<String>() {
@Override
public void onSuccess(@NonNull String translatedText) {
// Translation successful.
myhashmap.clear();
Log.e(TAG, " translation successful " + translatedText);
myhashmap.put("translation", translatedText);
myhashmap.put("iteratorkey", iteratorkey);
myhashmap.put("number", item.getNum());
thelist.add(myhashmap);
Log.e(TAG, " the list : " + thelist.size());
HashMap<String, Object> map = new HashMap<>();
map.put("base", translatedText);
//Write to database
myRef
.child(iteratorkey).child(item.getNum()).updateChildren(map);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Error.
// ...
Log.e(TAG, "error in translation");
}
});
} while (iterator2.hasNext());
textView.append(iteratorkey + "\n");
} while (iterator1.hasNext());
Log.e(TAG, " A the list size : " + thelist.size());
}
Log.e(TAG, " B the list size : " + thelist.size());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
答案 0 :(得分:0)
监听器不是问题,我实际上只想检索一次数据。因为我正在编辑相同的数据,所以正在检索。
问题在于,firebase始终会写入同一孩子。那就是为什么我认为只有最后一项被修改了。 当我拨打商品号码
item.getNum()
它将始终是最后获取的值,也许有人可以对此进行更详细的解释。
所以我刚刚宣布了final项目。
final Item item = iterator.next().getValue(Item.class);
现在已按预期修改了Firebase数据库中的数据。