Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Java 如何从firebase数据库获取数据列表?_Java_Android_Database_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何从firebase数据库获取数据列表?

Java 如何从firebase数据库获取数据列表?,java,android,database,firebase,firebase-realtime-database,Java,Android,Database,Firebase,Firebase Realtime Database,我正在尝试获取一些列表数据并放入一个列表中。但我没能做到。我尝试了很多东西,但都没有成功 这是我的数据库结构。 所以有一个主根是user,然后是username,在本例中是“mm”。此节点包括一些数据和一些其他节点。费用是其中之一。在费用中有一些独特的钥匙。每个唯一的键表示不同的收据。每个唯一的密钥存储此收据的产品。在这种情况下,有三个(0-1-2)。三个不限。它可以是3、1或15。每个节点都以“Expenses”类类型存储一个值 我想把这些数据列成一个列表。所以这个列表应该存储这样的数据 {

我正在尝试获取一些列表数据并放入一个列表中。但我没能做到。我尝试了很多东西,但都没有成功

这是我的数据库结构。

所以有一个主根是user,然后是username,在本例中是“mm”。此节点包括一些数据和一些其他节点。费用是其中之一。在费用中有一些独特的钥匙。每个唯一的键表示不同的收据。每个唯一的密钥存储此收据的产品。在这种情况下,有三个(0-1-2)。三个不限。它可以是3、1或15。每个节点都以“Expenses”类类型存储一个值

我想把这些数据列成一个列表。所以这个列表应该存储这样的数据

{
    {
        Receipt1: {
            amount: 1,
            marketName: "aa",
            price: 2,
            productName: "bb"
        },
        {
            amount: 2,
            marketName: "cc",
            price: 3,
            productName: "dd"
        }
    }, {
        Receipt2: {
            {
                amount: 3,
                marketName: "ee",
                price: 5,
                productName: "ff"
            },
            {
                amount: 1,
                marketName: "gg",
                price: 7,
                productName: "jj"
            },
            {
                amount: 9,
                marketName: "nn",
                price: 5,
                productName: "vv"
            }
        }
    }
所以我应该能够单独访问收据。若我搜索Receipt1,那个么我应该得到3个节点,如示例所示

我试图得到这样的数据。但它不起作用

private void receiptGetter(String userName,SimpleCallback<Boolean> finishedCallback) {

        DatabaseReference rootRef = databaseManager.getReference();
        DatabaseReference expensesRef = rootRef.child("user").child(userName).child("expenses");
        Query queryReceiptFinder = expensesRef.orderByKey();
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for(DataSnapshot ds : dataSnapshot.getChildren()) {

                    expenses = ds.getValue(Expenses.class);
                    expensesList.add(expenses);

                }
                finishedCallback.run(true);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("error", databaseError.getMessage());
                finishedCallback.run(false);
            }
        };
        queryReceiptFinder.addListenerForSingleValueEvent(valueEventListener);
    }

我认为Firestore比实时数据库更适合您的用途。如果您可以在文档中使用它,您可以看到如何访问每个文档

这是官方文件的链接:

通常,您可以通过以下方式访问文档:

DocumentReference docRef = db.collection("cities").document("SF");
// asynchronously retrieve the document
ApiFuture<DocumentSnapshot> future = docRef.get();
// ...
// future.get() blocks on response
DocumentSnapshot document = future.get();
if (document.exists()) {
  System.out.println("Document data: " + document.getData());
} else {
  System.out.println("No such document!");
}

是的,但这是一个大项目。我在做这件事已经有一段时间了。此方法只是当前应用程序的一个实现。我不能把它换成firestore这会花很多时间。但感谢您提供的信息,我将使用firestore进行未来的开发。您可以将快照作为对象的ArrayList来阅读
DocumentReference docRef = db.collection("cities").document("SF");
// asynchronously retrieve the document
ApiFuture<DocumentSnapshot> future = docRef.get();
// ...
// future.get() blocks on response
DocumentSnapshot document = future.get();
if (document.exists()) {
  System.out.println("Document data: " + document.getData());
} else {
  System.out.println("No such document!");
}
db.collection("cities").document("SF").collection("nameCollection").document("documentName");