我正在从firebase数据库中读取数据。以下是存储在数据库中的数据的快照。
以" 8SS开头的快照字符串..."是用户的uid。以下是从firebase数据库中检索数据的代码。
//To check if uid of current user and database user matches.
Query q = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid()).equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
q.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "Yay!!");
User us = singleSnapshot.getValue(User.class);
String string = "Name: "+ us.getName()+"\nAddress: "+ us.getlat()+ us.getlon()+ "\n\n";
n.setText(string);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// read query is cancelled.
Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
}
});
用户类包含getter和setter
错误是仅empty Text View appears
结束reading from database fails
。
query is true or false?
我试过用这个:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Location").child("8SS0uk4FmiPUtXP208Tx8Cqxt2z2");
然后呼叫ref.addListenerForSingleValueEvent()
,但仍然没有显示任何内容。
我试过用这个:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid());
这会给dataSnapShot : "DataSnapshot={key='-Kn...', value="latitude:.., longitude:..., Name:..."}
。但这不是我的预期。
数据库结构应该是Location --> Uid --> Name : "Jane", ..
。
这是我在数据库中插入数据的代码。
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser() ;
refDatabase = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid());
DatabaseReference newPost = refDatabase.push();
//the push() command is already creating unique key
Map<String, String> mapname = new HashMap<String, String>();
mapname.put("Name", n.getText().toString());
mapname.put("latitude", Double.toString(lat));
mapname.put("longitude", Double.toString(longt));
mapname.put("user id", user.getUid());
newPost.setValue(mapname);
答案 0 :(得分:1)
我通过引入多个for循环解决了这个问题
所以,我的第一个孩子的快照是mRef.addValueEventListener(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "Children" + dataSnapshot.getKey());
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
String st = singleSnapshot.getKey();
Log.d(TAG, "Yay!!" + singleSnapshot.child(st));
st = "";
int count=0;
for(DataSnapshot singleSnap : singleSnapshot.getChildren()) {
Log.d(TAG, "String" + singleSnap.getValue());
//n.setText(us.getName());
if(count==0) {
st = "Name: " + singleSnap.getValue() + '\n';
}
else if(count==1) {
st = st + "Latitude: " + singleSnap.getValue() + '\n';
}
else if(count==2) {
st = st + "Longitude: " + singleSnap.getValue() + '\n';
}
count++;
}
final TextView rowTextView = new TextView(Menu5.this.getActivity());
rowTextView.setText((CharSequence) st);
ll.addView(rowTextView);
}
}
下面是提取所有值和键的代码:
OnCommand
这为push创建的每个唯一id提供了单个键和值对。因此,我必须对连接进行硬编码并显示,因为整个应用程序中的结构将保持相同。
答案 1 :(得分:0)
为什么你使用等于然后获得当前用户。 .child(user.getUid())应该已经是你当前的用户,它会为你提供你想要听的孩子的价值。
我认为uuid是&#34; 8SSOuk .......&#34;的孩子。 所以看起来应该是这样的: 。FirebaseDatabase.getInstance()getReference()子(&#34;位置&#34)。孩子。(&#34; 8SSOuk .......&#34)。子(user.getUid()) ;