如何获取父节点的值作为字符串?
How to get value of parent node as string?
所以在上面的数据结构中,我要获取值Aprilia Caponord 1200
(图中标注)。我有 Firebase 对 Aprilia
(根节点)的引用,我可以获得所有 key/value 对数据。
这是我的代码
@override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChild()) {
Map<?, ?> value = (Map<?, ?>) child.getValue();
String bike_price = value.get("price").toString();
String image_url = value.get("image_url").toString();
}
}
很明显,我可以获得具有 key/value 关系的子节点的所有值。但是我无法具体获取父节点的名称。那么如何获取String
格式的父节点的值呢?
如果我打印 child.getValue().toString()
,我得到 JSON 值,但我对解析 JSON 不感兴趣。有没有具体的获取父节点值的方法?
{Aprilia Caponord 1200={image_url=____________, price=18.35}.. }
您可能正在 DataSnapshot
上寻找 getKey()
方法:
mFirebaseRef = new Firebase("https://yours.firebaseio.com");
mFirebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
Log.i("MainActivity", child.getKey());
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("MainActivity", "onCancelled", firebaseError.toException());
}
});
这里有几点需要注意:
- 我将您代码中的
getChild()
更改为 getChildren()
,因为没有我知道的方法 getChild()
。
- 您应该考虑使用
addChildEventListener
,它在较低级别的节点上为您提供 DataSnapshots
- 如果您为您的汽车创建 "wrapper classes",事情会变得容易得多。 Android 的 Firebase SDK 然后会自动将 JSON 解包到 class 的实例中。请参阅我们的 AndroidChat repo 以了解这方面的一个很好的例子。
遇到这种情况,解决方法如下:
final ChildEventListener countsListener = new ChildEventListener() { //for querying how many card created by each user in a specific period
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
/**
* $ROOT/Apirilia/Apirilia_id/CardId/IMG_URL
* $ROOT/Apirilia/Apirilia_id/CardId/PRICE
* ^[key] :[value]
*/
if (dataSnapshot == null) {
Logger.e("!!! dataSnapshot is null");
return;
}
String apirilia_id = dataSnapshot.getRef().getParent().getKey();
Logger.d("... Apirilia_id:" + apirilia_id);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
我很感激能帮上忙。
对于那些在 firebaseUi 中寻找密钥的人,此代码将适用于您:-
firebaseadapterinstance.getRef(position).getKey();
所以在上面的数据结构中,我要获取值Aprilia Caponord 1200
(图中标注)。我有 Firebase 对 Aprilia
(根节点)的引用,我可以获得所有 key/value 对数据。
这是我的代码
@override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChild()) {
Map<?, ?> value = (Map<?, ?>) child.getValue();
String bike_price = value.get("price").toString();
String image_url = value.get("image_url").toString();
}
}
很明显,我可以获得具有 key/value 关系的子节点的所有值。但是我无法具体获取父节点的名称。那么如何获取String
格式的父节点的值呢?
如果我打印 child.getValue().toString()
,我得到 JSON 值,但我对解析 JSON 不感兴趣。有没有具体的获取父节点值的方法?
{Aprilia Caponord 1200={image_url=____________, price=18.35}.. }
您可能正在 DataSnapshot
上寻找 getKey()
方法:
mFirebaseRef = new Firebase("https://yours.firebaseio.com");
mFirebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
Log.i("MainActivity", child.getKey());
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("MainActivity", "onCancelled", firebaseError.toException());
}
});
这里有几点需要注意:
- 我将您代码中的
getChild()
更改为getChildren()
,因为没有我知道的方法getChild()
。 - 您应该考虑使用
addChildEventListener
,它在较低级别的节点上为您提供DataSnapshots
- 如果您为您的汽车创建 "wrapper classes",事情会变得容易得多。 Android 的 Firebase SDK 然后会自动将 JSON 解包到 class 的实例中。请参阅我们的 AndroidChat repo 以了解这方面的一个很好的例子。
遇到这种情况,解决方法如下:
final ChildEventListener countsListener = new ChildEventListener() { //for querying how many card created by each user in a specific period
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
/**
* $ROOT/Apirilia/Apirilia_id/CardId/IMG_URL
* $ROOT/Apirilia/Apirilia_id/CardId/PRICE
* ^[key] :[value]
*/
if (dataSnapshot == null) {
Logger.e("!!! dataSnapshot is null");
return;
}
String apirilia_id = dataSnapshot.getRef().getParent().getKey();
Logger.d("... Apirilia_id:" + apirilia_id);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
我很感激能帮上忙。
对于那些在 firebaseUi 中寻找密钥的人,此代码将适用于您:-
firebaseadapterinstance.getRef(position).getKey();