gpt4 book ai didi

java - 如何在节点Firebase中获得唯一的随机产品?

转载 作者:行者123 更新时间:2023-12-02 04:29:45 25 4
gpt4 key购买 nike

数据:

- products
- -L74Pc7oVY22UsCETFBv
- name: "gjwj"
- category: "hreggrrg"
- location: "vjhiwehifwe"
- price: 44
- color: fassaf
- -L74uJ7oVYcVNyCteFBz
- name: "uygfwh"
- category: "hhhjwwwom"
- location: "pervrr"
- price: 33
- color: yrtrr
......................


我在节点 products中有很多产品,超过1000种产品。我可以在 ListView中显示所有内容。我只想向用户显示一个唯一的随机变量,例如高亮显示,而不是全部下载,仅下载一个。

码:

ValueEventListener v = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot child : dataSnapshot.getChildren()) {
String name = (String) child.child("name").getValue().toString();
Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
//How to get?????
}
}

@Override
public void onCancelled(DatabaseError databaseError) {}
};
FirebaseDatabase.getInstance().getReference().addListenerForSingleValueEvent(v);


如何在节点Firebase中获得唯一的随机产品?

最佳答案

好吧,SOF上有一些很好的答案,但它们是分开的,所以我将尝试使用两种方法来回答您的问题。

但首先,在编写一些代码之前,我可以告诉您该代码无法正常工作,因为您在参考中误认为了一个孩子,即products,显然假设products节点是您的直接孩子。 Firebase数据库根。

实际答案:

假设您的数据库结构如下所示(其中products节点是Firebase数据库的直接子级):

Firebase-root
|
--- products
|
--- productIdOne
| |
| --- name: "gjwj"
| |
| --- category: "hreggrrg"
| |
| --- location: "vjhiwehifwe"
| |
| --- price: 44
| |
| --- color: "fassaf"
|
--- productIdTwo
| |
| --- name: "uygfwh"
| |
| --- category: "hhhjwwwom"
| |
| --- location: "pervrr"
| |
| --- price: 33
| |
| --- color: "yrtrr"
|
--- //And so on


要获得随机产品,请使用以下代码:

ListView listView = (ListView) findViewById(R.id.list_view);
ArrayAdapter arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, randomProductList);
listView.setAdapter(arrayAdapter);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productsRef = rootRef.child("products"); //Added call to .child("products")
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> productList = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String name = ds.child("name").getValue(String.class);
productList.add(name);
}

int productListSize = productList.size();
List<String> randomProductList = new ArrayList<>();

randomProductList.add(new Random().nextInt(productListSize)); //Add the random product to list
arrayAdapter.notifyDatasetChanged();
}

@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
};
productsRef.addListenerForSingleValueEvent(valueEventListener);


为了获得所有产品,您需要遍历 products节点的所有子级。因此,必须调用 child("products")

如果您需要一个以上的随机乘积,则可以创建一个循环并在 randomProductList中添加任意数量的随机乘积。

这称为经典解决方案,您可以将其用于仅包含少量记录的节点,但是如果您担心会获取大量数据,那么我建议您使用第二种方法。这还涉及通过添加名为 productIds的新节点来对数据库进行一些更改。您的数据库结构应如下所示:

Firebase-root
|
--- products
| |
| --- productIdOne
| | |
| | --- //details
| |
| --- productIdTwo
| |
| --- //details
|
--- productIds
|
--- productIdOne: true
|
--- productIdTwo: true
|
--- //And so on


因此,正如您在问题中提到的那样,如果要避免下载包含所有具有所有属性的产品的整个 products节点,则必须创建一个名为 productIds的单独节点。因此,要获得一个产品,您只需下载一个仅包含产品ID的简单节点。

这种做法称为非规范化(复制数据),是涉及Firebase的常见做法。为了更好地理解,我建议您观看此视频 Denormalization is normal with the Firebase Database

但是要记住,在您将随机产品添加到这个新创建的节点中的方式中,就像您在不再需要它们时需要删除它们一样。

因此,要获得随机产品,您需要查询数据库两次。请参见下面的代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productIdsRef = rootRef.child("productIds");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> productIdsList = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String productId = ds.getKey();
productIdsList.add(productId);
}

int productListSize = productList.size();
List<String> randomProductList = new ArrayList<>(););

DatabaseReference productIdRef = rootRef.child("products").child(productIdsList.get(new Random().nextInt(int productListSize));
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("name").getValue(String.class);
Log.d("TAG", name);
}

@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
};
productIdRef.addListenerForSingleValueEvent(eventListener);
}

@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
}
};
productIdsRef.addListenerForSingleValueEvent(valueEventListener);


对Firebase数据库执行查询时,可能会有多个结果。因此, dataSnapshot包含这些结果的列表。即使只有一个结果, dataSnapshot对象也将包含一个结果的列表。

关于java - 如何在节点Firebase中获得唯一的随机产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56593062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com