2017-03-27 3 views
0

現在、Firebaseデータベースでクエリを実行しようとしていますが、ログに必要な値が表示されますが、常に空のarraylistが返されます。空のArrayList - Firebaseのデータ検索

は親切に以下の私のコードを見つける:

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; 
} 

マイPOJO:

public class Transaction { 
    private String id; 

    private String userId; 

    private String categoryId; 

    private TransactionType transactionType; 

    private String creationDate; 

    private long amount; 

    private String description; 
    /** 
    * No args constructor 
    */ 
    public Transaction() {} 


    /** 
    * Constructor for the Transaction object 
    * @param userId id of the user who made the transaction 
    * @param categoryId ID of the category the transaction belongs under 
    * @param amount amount spent/received 
    * @param transactionType income/expense 
    */ 
    public Transaction(String userId, String categoryId, TransactionType transactionType, long amount, String description) { 
     this.userId = userId; 
     this.categoryId = categoryId; 
     this.transactionType = transactionType; 
     this.amount = amount; 

     this.description = description; 

     //Date last changed will always be set to ServerValue.TIMESTAMP 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
     String currentDateTime = dateFormat.format(new Date()); // Find todays date 

     this.creationDate = currentDateTime; 
    } 

    /** 
    * Transaction Id Getter 
    * @return transaction Id 
    */ 
    public String getId() { 
     return id; 
    } 

    /** 
    * Transaction Id Setter 
    * @param id Id to assign to the user 
    */ 
    public void setId(String id) { 
     this.id = id; 
    } 

    /** 
    * Category Id getter 
    * @return category Id under which the transaction belongs 
    */ 
    public String getCategoryId() { 
     return categoryId; 
    } 

    /** 
    * Category Id setter 
    * @param categoryId category Id under which the transaction belongs 
    */ 
    public void setCategoryId(String categoryId) { 
     this.categoryId = categoryId; 
    } 

    /** 
    * Transaction type getter 
    * @return type of the transaction whether its an income or an expense 
    */ 
    public TransactionType getTransactionType() { 
     return transactionType; 
    } 

    /** 
    * Transaction type setter 
    * @param transactionType type of the transaction to set 
    */ 
    public void setTransactionType(TransactionType transactionType) { 
     this.transactionType = transactionType; 
    } 

    /** 
    * Transaction creation date getter 
    * @return creation date of the transaction 
    */ 
    public String getCreationDate() { 
     return creationDate; 
    } 

    /** 
    * Transaction creation date setter 
    * @param creationDate creation date to set to the transaction 
    */ 
    public void setCreationDate(String creationDate) { 
     this.creationDate = creationDate; 
    } 

    /** 
    * Transaction amount getter 
    * @return amount set 
    */ 
    public long getAmount() { 
     return amount; 
    } 

    /** 
    * Transaction amount setter 
    * @param amount amount to set 
    */ 
    public void setAmount(long amount) { 
     this.amount = amount; 
    } 

    /** 
    * User Id getter 
    * @return user id corresponding to the transaction 
    */ 
    public String getUserId() { 
     return userId; 
    } 

    /** 
    * User Id setter 
    * @param userId user id to set to the transaction 
    */ 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    /** 
    * Description getter 
    * @return Description corresponding to the transaction 
    */ 
    public String getDescription() { 
     return description; 
    } 
    /** 
    * Description setter 
    * @param description Description to set to the transaction 
    */ 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    /** 
    * Transaction object string representation 
    * @return object represented in a string 
    */ 
    @Override 
    public String toString() { 
     return "Transaction{" + 
       "id='" + id + '\'' + 
       ", userId='" + userId + '\'' + 
       ", categoryId='" + categoryId + '\'' + 
       ", transactionType=" + transactionType + 
       ", creationDate='" + creationDate + '\'' + 
       ", amount=" + amount + 
       '}'; 
    } 
} 

マイ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()); 
     // ... 
    } 
}); 
} 

使用

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

getUserTransactions("{userId}", transactions); 

//check after method call while debugging if transactions is empty 

これはあなたがArrayListのである場合、このイベントの実装を使用しているつもり動作しない場合:

+0

したがって、このログ:Log.w(TAG、t.toString());値を返しますか? –

+0

@ChesterCobusいいえ、私のPOJOの文字列表現を出力します。 – hallaksec

+0

実行時にPOJOの値を記録するのですか? –

答えて

1

は、これは、あなたの質問に答えるだけの試みです使用されています。 Firebaseのクエリは非同期であることに注意してください。