我无法从 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 特定位置获取值

在 Java 中向 Firebase 中的特定主题发送通知

Flutter & Firebase - 从文档中获取特定字段

如何快速从 firebase 获取用户的特定数据?

从特定位置获取firebase的数据

尝试从Firebase数据库获取时无法获取CarType