Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 空ArrayList-Firebase数据检索_Android_Firebase_Firebase Realtime Database_Pojo - Fatal编程技术网

Android 空ArrayList-Firebase数据检索

Android 空ArrayList-Firebase数据检索,android,firebase,firebase-realtime-database,pojo,Android,Firebase,Firebase Realtime Database,Pojo,我目前正试图在firebase DB上运行一个查询,我可以在日志中看到我想要的值,但我的方法总是返回一个空的arraylist 请在下面找到我的代码: public static ArrayList<Transaction> getUserTransactions(String userId){ Query userTransactionQuery = mDatabaseReference .child("transactions")

我目前正试图在firebase DB上运行一个查询,我可以在日志中看到我想要的值,但我的方法总是返回一个空的arraylist

请在下面找到我的代码:

public static ArrayList<Transaction> getUserTransactions(String userId){
    Query userTransactionQuery = mDatabaseReference
            .child("transactions")
            .orderByChild("userId")
            .equalTo(userId);

    final ArrayList<Transaction> transactionsByUser = new ArrayList<>();

    userTransactionQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot transactionSnapshot: dataSnapshot.getChildren()) {
                // TODO: handle the post
                Transaction t = transactionSnapshot.getValue(Transaction.class);
                transactionsByUser.add(t);
                Log.w(TAG, t.toString());
            }

            Log.i(TAG, "Collected User Transactions");
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Transaction failed, log a message
            Log.w(TAG, "loadTransactions:onCancelled", databaseError.toException());
            // ...
        }
    });

    return transactionsByUser;
}
我的JSON树如下所示:

{
  transactions:
    {
      transactionId {
        pojo
      }
  }        
}

简言之:我试图做的是获取用户使用其用户ID进行的所有事务,我试图将结果存储在数组列表中,但数组列表始终返回空

所以这只是一个尝试来回答你的问题:

public static void getUserTransactions(String userId, final ArrayList<Transaction> transactionsByUser){
Query userTransactionQuery = mDatabaseReference
        .child("transactions")
        .orderByChild("userId")
        .equalTo(userId);

userTransactionQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot transactionSnapshot: dataSnapshot.getChildren()) {
            // TODO: handle the post
            Transaction t = transactionSnapshot.getValue(Transaction.class);
            transactionsByUser.add(t);
            Log.w(TAG, t.toString());
        }

        Log.i(TAG, "Collected User Transactions");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Transaction failed, log a message
        Log.w(TAG, "loadTransactions:onCancelled", databaseError.toException());
        // ...
    }
});
}
publicstaticvoidgetusertransactions(字符串userId,finalarraylisttransactionsbyuser){
Query userTransactionQuery=mDatabaseReference
.child(“交易”)
.orderByChild(“用户ID”)
.equalTo(用户ID);
userTransactionQuery.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot transactionSnapshot:DataSnapshot.getChildren()){
//托多:处理这件事
事务t=transactionSnapshot.getValue(Transaction.class);
transactionsByUser.add(t);
Log.w(TAG,t.toString());
}
Log.i(标记“收集的用户事务”);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
//获取事务失败,请记录消息
w(标记“loadTransactions:onCancelled”,databaseError.toException());
// ...
}
});
}
用法

ArrayList<Transaction> transactions = new ArrayList<>();

getUserTransactions("{userId}", transactions);

//check after method call while debugging if transactions is empty
ArrayList事务=新建ArrayList();
getUserTransactions(“{userId}”,事务);
//调试时检查方法调用后事务是否为空

如果这不起作用,则必须在使用ArrayList的位置使用此事件实现。请注意Firebase查询是异步的。

使用
LiveData
解决
异步
操作中的同步问题

private static MutableLiveData<ArrayList<Transaction>> mutableTransactionsByUser = new MutableLiveData<>();

public static MutableLiveData<ArrayList<Transaction>> getUserTransactions(String userId){
    Query userTransactionQuery = mDatabaseReference
            .child("transactions")
            .orderByChild("userId")
            .equalTo(userId);

    final ArrayList<Transaction> transactionsByUser = new ArrayList<>();

    userTransactionQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot transactionSnapshot: dataSnapshot.getChildren()) {
                // TODO: handle the post
                Transaction t = transactionSnapshot.getValue(Transaction.class);
                transactionsByUser.add(t);
                Log.w(TAG, t.toString());
            }

            //Post here
            mutableTransactionsByUser.postValue(transactionsByUser);
            Log.i(TAG, "Collected User Transactions");
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Transaction failed, log a message
            Log.w(TAG, "loadTransactions:onCancelled", databaseError.toException());
            // ...
        }
    });

    return mutableTransactionsByUser;
}

所以这个日志是:log.w(TAG,t.toString());返回值?@ChesterCobus否,它打印我的POJO的字符串表示。我的意思是,当它运行时,它会记录POJO的值吗?@ChesterCobus哦,对不起,我误解了,是的,它会记录。我想发生的是,事件是在列表返回后触发的,这就是为什么它是空的。
private static MutableLiveData<ArrayList<Transaction>> mutableTransactionsByUser = new MutableLiveData<>();

public static MutableLiveData<ArrayList<Transaction>> getUserTransactions(String userId){
    Query userTransactionQuery = mDatabaseReference
            .child("transactions")
            .orderByChild("userId")
            .equalTo(userId);

    final ArrayList<Transaction> transactionsByUser = new ArrayList<>();

    userTransactionQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot transactionSnapshot: dataSnapshot.getChildren()) {
                // TODO: handle the post
                Transaction t = transactionSnapshot.getValue(Transaction.class);
                transactionsByUser.add(t);
                Log.w(TAG, t.toString());
            }

            //Post here
            mutableTransactionsByUser.postValue(transactionsByUser);
            Log.i(TAG, "Collected User Transactions");
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Transaction failed, log a message
            Log.w(TAG, "loadTransactions:onCancelled", databaseError.toException());
            // ...
        }
    });

    return mutableTransactionsByUser;
}
getUserTransactions(userId).observe(this, new Observer<ArrayList<Transaction>>() {
    @Override
    public void onChanged(ArrayList<Transaction> transactions) {
        // Do your operation here
    }
});