【发布时间】:2018-07-21 02:26:23
【问题描述】:
我有很多关于在我的 Android 应用中处理异步数据库的问题。
因为我知道数据库是异步的,所以我尝试了几种方法来处理它。正如您在我的代码中看到的,我有两个函数需要在我的数据库中使用数组。我的第一个函数 (setArrayfromDatabase) 将在我的数据库中的数组上应用更改,而我的第二个函数 (setAnotherArray) 需要将此数组与从我的第一个函数应用的更改一起使用。这是我的代码:
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myReff =database.getReference("server").child("user");
myReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Take the array from my database
final ArrayList<Integer> array_from_database;
GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
array_from_database = dataSnapshot.getValue(genericTypeIndicator) ;
System.out.println("1");
//use this array in this first function, and this function will modify it.
setArray_for_database(array_from_database);
myReff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//this will be executed only if my array is changed (So only if my other function have been correctly executed
setAnotherArray(array_from_database);
System.out.println("3");
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这里是 setArray_for_database 的代码:
public void setArray_for_database(ArrayList<Integer> array_from_database){
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myReff =database.getReference();
//Take the array from my database (gived in parameter)
final ArrayList<Integer> array = array_from_database;
myReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//this will be executed, even if data hasn't been changed because of the method (addListenerForSingleValueEvent)
System.out.println("2");
array.set(0,3);
Map<String, Object> chemainChild = new HashMap<>();
chemainChild.put("server/user/",array);
myReff.updateChildren(chemainChild);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
这是我的窍门。在另一个myReff.addListenerForSingleValueEvent(new ValueEventListener() 中拥有一个myReff.addValueEventListener(new ValueEventListener() 的目的是仅在我的数据库中的数组已更改时才执行onDataChange。但问题是事实并非如此。
这是首先打印的内容:1、3、2 而不是 1、2、3,就像我期望的那样。
你能帮帮我吗?我是否以错误的方式处理问题?在我的数组已更改的情况下,我该怎么做才能只执行我的第二个函数?在执行其他操作之前,如何让我的代码等待数据库中的更改?
希望你能理解我,如果你不明白我的问题,请随时问我问题。
【问题讨论】:
-
您尝试“加入”两个 Firebase 引用列表的事实意味着您的数据建模错误并且您将其视为关系数据库
-
@Diridou 这个答案对你有帮助吗?
-
@PeterHaddad 目前我的模拟器有问题,所以我无法测试它,但我会告诉你非常感谢彼得
-
没问题
标签: java android firebase asynchronous firebase-realtime-database