我无法从 Firebase (Java) 获取特定数据
Posted
技术标签:
【中文标题】我无法从 Firebase (Java) 获取特定数据【英文标题】:I can't get specific data from Firebase (Java) 【发布时间】:2019-04-21 22:09:28 【问题描述】:我正在做一个应用程序,我需要在我的火力基地中获取纬度和经度。我将 Latlng 放入火力基地没有任何问题,但我无法将其取回。这就是它的样子:
.
这是我将它们放入 firebase 时的代码
Ajouter.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
mProgress.setTitle("Le point se charge");
mProgress.setMessage("Merci de patientez, ce ne sera pas long");
mProgress.show();
mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
mFirebaseDatabase = FirebaseDatabase.getInstance();
mMarkDatabase = mFirebaseDatabase.getReference();
final String key = mMarkDatabase.child("Pins").push().getKey();
final StorageReference ref = mStorage.child("Photos/" + UUID.randomUUID().toString());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] data = baos.toByteArray();
UploadTask uploadTask = ref.putBytes(data);
uploadTask = ref.putFile(ImageUri);
Task<Uri> urltask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>()
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception
if (!task.isSuccessful())
throw task.getException();
return ref.getDownloadUrl();
).addOnCompleteListener(new OnCompleteListener<Uri>()
@Override
public void onComplete(@NonNull Task<Uri> task)
if (task.isSuccessful())
downloadUrl = task.getResult();
downloadUrlTxt = downloadUrl.toString();
//uploadImage();
String lon = Double.toString(Longitude);
String lat = Double.toString(Latitude);
String txt = TxtAout.getText().toString();
switch (spinner.getSelectedItemPosition())
case 0 :
item.put("ImageUrl", ""+downloadUrlTxt);
item.put("Longitude ", lon);
item.put("Latitude", lat);
item.put("Description", txt);
mMarkDatabase.child("Pins").child("Poubelle").child(key).setValue(item);
break;
case 1 :
item.put("ImageUrl", ""+downloadUrlTxt);
item.put("Longitude ", lon);
item.put("Latitude", lat);
item.put("Description", txt);
mMarkDatabase.child("Pins").child("BlueLy").child(key).setValue(item);
break;
case 2 :
item.put("ImageUrl", ""+downloadUrlTxt);
item.put("Longitude ", lon);
item.put("Latitude", lat);
item.put("Description", txt);
mMarkDatabase.child("Pins").child("Parcs a chiens").child(key).setValue(item);
break;
case 3 :
item.put("ImageUrl", ""+downloadUrlTxt);
item.put("Longitude ", lon);
item.put("Latitude", lat);
item.put("Description", txt);
mMarkDatabase.child("Pins").child("Collecte de vetements").child(key).setValue(item);
break;
default :
Toast.makeText(LocalisationOnlyVert.this, "Erreur, merci de recommencer", Toast.LENGTH_SHORT).show();
mProgress.dismiss();
Toast.makeText(LocalisationOnlyVert.this, "Merci de votre ajout !", Toast.LENGTH_SHORT).show();
TxtAout.setText("");
Intent Retour = new Intent (LocalisationOnlyVert.this, OnlyVert.class);
startActivity(Retour);
Toast.makeText(LocalisationOnlyVert.this, ""+downloadUrlTxt , Toast.LENGTH_LONG).show();
);
);
我不知道如何区分我的纬度、经度、描述和 URL。我不知道该怎么办了。
编辑:在你发给我之后我试过了:
BtnMarker.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
for(DataSnapshot snapshot: dataSnapshot.getChildren())
HandleData.Pin pin = snapshot.getValue(HandleData.Pin.class);
Toast.makeText(OnlyVert.this, pin.getLat(), Toast.LENGTH_SHORT).show();
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
错误是com.google.firebase.database.DatabaseException: Class com.example.alexandre.onlyvert.HandleData$Pin does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
【问题讨论】:
邮政编码代替图片 你用什么代码来获取数据? 是的,我很抱歉它已经完成了 问题解决了吗? 我已经尝试了几件事,但似乎都没有按我的意愿工作。你知道什么是最好的办法吗? 【参考方案1】:使用下面这个类,它有你想要的一切
您也可以使用它来设置数据并跟踪事件
您可以使用它获取数据并再次跟踪事件
public class HandleData
private OnDataSet onDataSet;
private OnDataCallBack onDataCallBack;
public void setOnDataSet(OnDataSet onDataSet)
this.onDataSet = onDataSet;
public void setOnDataCallBack(OnDataCallBack onDataCallBack)
this.onDataCallBack = onDataCallBack;
private FirebaseDatabase firebaseDatabase;
public HandleData()
firebaseDatabase = FirebaseDatabase.getInstance();
public void putData(String specificNode, Pin pin)
DatabaseReference databaseReference = firebaseDatabase.getReference("path/to/node/").child(specificNode);
databaseReference.setValue(pin).addOnSuccessListener(new OnSuccessListener<Void>()
@Override
public void onSuccess(Void aVoid)
if(onDataSet != null)
onDataSet.onSucess();
).addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
if(onDataSet != null)
onDataSet.onFailed(e.toString());
);
public void readData(String specificNode)
DatabaseReference databaseReference = firebaseDatabase.getReference("path/to/node/").child(specificNode);
databaseReference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
if(dataSnapshot.exists())
int initCount = 0;
int totalCount = (int) dataSnapshot.getChildrenCount();
ArrayList<Pin> pins = new ArrayList<>();
for(DataSnapshot snapshot : dataSnapshot.getChildren())
initCount = initCount +1;
Pin pin = snapshot.getValue(Pin.class);
pins.add(pin);
if(initCount == totalCount)
if(onDataCallBack != null)
onDataCallBack.onSuccess(pins);
else
if(onDataCallBack != null)
onDataCallBack.onFailed("no data found in database");
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
if(onDataCallBack != null)
onDataCallBack.onFailed(databaseError.toString());
);
public class Pin
private String about;
private String imgUrl;
private String lat;
private String lng;
public Pin()
public Pin(String about, String imgUrl, String lat, String lng)
this.about = about;
this.imgUrl = imgUrl;
this.lat = lat;
this.lng = lng;
public String getAbout()
return about;
public void setAbout(String about)
this.about = about;
public String getImgUrl()
return imgUrl;
public void setImgUrl(String imgUrl)
this.imgUrl = imgUrl;
public String getLat()
return lat;
public void setLat(String lat)
this.lat = lat;
public String getLng()
return lng;
public void setLng(String lng)
this.lng = lng;
public interface OnDataSet
void onSucess();
void onFailed(String error);
public interface OnDataCallBack
void onSuccess(ArrayList<Pin> pins);
void onFailed(String error);
【讨论】:
非常感谢,我马上试试,告诉你它是否有效:D 所以我尝试了你的方法,但我真的不知道一切是如何工作的【参考方案2】:这里有错别字
item.put("Longitude ", lon);
改成这个
item.put("Longitude", lon);
因为这是在您的 Firebase 结构中使用“”推送键值,这就是为什么您无法获取该值的原因,因为 Map 需要一个键 - 值对才能工作并且它无法找到经度数据。
此外,更改此设置后,您需要推送新值并删除数据库中错误的值
logcat 异常在这里指出
double longitude = Double.parseDouble(map.get("Longitude"));
有了这个
java.util.Map 具有泛型类型参数
现在,获取数据。
据我了解,您需要按一个按钮并从 firebase 的该节点获取所有 LatLang,假设您有一个按钮 Poubelle 从该节点获取所有纬度和经度,可以以这种方式完成。
mDatabase = FirebaseDatabase.getInstance().getReference();
DatabaseReference mPoubelleRef = mDatabase.child("Pins").child("Poubelle");
BtnPoubelle.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
mPoubelleRef.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
for(DataSnapshot snapshot: dataSnapshot.getChildren())
Map<String, String> map = snapshot.getValue(Map.class);
double latitude = Double.parseDouble(map.get("Latitude"));
double longitude = Double.parseDouble(map.get("Longitude"));
//or get the data with a model (is the same thing as above)
YourModel model = snapshot.getValue(YourModel.class);
double latitude = model.getLatitude();
double longitude = model.getLongitude();
@Override
public void onCancelled(DatabaseError databaseError)
System.out.println("The read failed: " + databaseError.getCode());
);
在检索数据之前,先删除带有
的节点“经度”:
否则每次尝试获取您的数据时都会失败。
【讨论】:
如果可行,您可以将答案标记为正确吗?谢谢,周末愉快以上是关于我无法从 Firebase (Java) 获取特定数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Firebase Android Query 中的 StartAt 特定位置和 EndAt 特定位置获取值