मुझे फायरबेस डेटाबेस में समस्या है। मैं उपयोगकर्ता के डेटा को उपयोगकर्ता आईडी (बच्चे) में बच्चे से धक्का देना चाहता हूं। कृपया मेरी मदद करें और समझाएं कि बच्चों को अद्वितीय उपयोगकर्ता के बाल संदर्भ से कैसे निकाला जाए। मैं पहले से ही उपयोगकर्ता आईडी बच्चे से डेटा निकाल सकता हूं, लेकिन मैं आगे नहीं बढ़ सकता। मैं लगभग हर जगह ढूंढ रहा था और जवाब नहीं मिला।

अग्रिम में धन्यवाद :)

यहाँ डेटाबेस है

नियम

{
/* Visit https://firebase.google.com/docs/database/security to learn more 
about security rules. */
 "rules": {
 ".read": "auth != null",
 ".write": "auth != null"
 }
 }

डेटाबेस देखें

package com.mcarrow.mapsservicerunning;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class ViewDatabase extends AppCompatActivity {
private static final String TAG="ViewDatabase";
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private String userID;
private ListView mListView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_database_layout);
    mListView =(ListView)findViewById(R.id.listview);
    mAuth=FirebaseAuth.getInstance();
    mFirebaseDatabase= FirebaseDatabase.getInstance();
    myRef=mFirebaseDatabase.getReference();
    FirebaseUser user=mAuth.getInstance().getCurrentUser();
    userID=user.getUid();
    mAuthListener=new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user =firebaseAuth.getInstance().getCurrentUser();
            if(user!=null){
                Log.d(TAG,"Signed in"+user.getUid());
                toastMessage("Signed In"+user.getEmail());
            }else {
                Log.d(TAG,"Signed Out");
                toastMessage("Signed Out");
            }

        }
    };
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            showData(dataSnapshot);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

private void showData(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds : dataSnapshot.getChildren()) {

            UserInformation uInfo = new UserInformation();
            ds= (DataSnapshot) ds.child(userID).getChildren();

uInfo.setName(ds.getValue(UserInformation.class).getName());
uInfo.setEmail(ds.getValue(UserInformation.class).getEmail());
uInfo.setPhone_num(ds.getValue(UserInformation.class).getPhone_num());
            Log.d(TAG, "showData: name: " + uInfo.getName());
            Log.d(TAG, "showzData: phone_num: " + uInfo.getPhone_num());
            Log.d(TAG, "showData: email: " + uInfo.getEmail());
            ArrayList<String> array = new ArrayList<>();
            array.add(uInfo.getName());
            array.add(uInfo.getEmail());
            array.add(uInfo.getPhone_num());
            ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
            mListView.setAdapter(adapter);
        }
    }


@Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
protected void onStop() {
    super.onStop();
    if(mAuthListener!=null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}
private void toastMessage(String message){
    Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}

}

उपयोगकर्ता जानकारी

package com.mcarrow.mapsservicerunning;

public class UserInformation {
private String Name;
private String Email;
private String Phone_num;
public UserInformation(){

}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getEmail() {
    return Email;
}

public void setEmail(String email) {
    Email = email;
}

public String getPhone_num() {
    return Phone_num;
}

public void setPhone_num(String phone_num) {
    Phone_num = phone_num;
}
}

LOGCAT

java.lang.ClassCastException: com.google.firebase.database.zza cannot be cast to com.google.firebase.database.DataSnapshot
    at com.mcarrow.mapsservicerunning.ViewDatabase.showData(ViewDatabase.java:73)
    at com.mcarrow.mapsservicerunning.ViewDatabase.access$100(ViewDatabase.java:23)
    at com.mcarrow.mapsservicerunning.ViewDatabase$2.onDataChange(ViewDatabase.java:58)
    at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source:13)
    at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
    at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
0
JAGUAR 29 सितंबर 2018, 23:23

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि मैंने आपके डेटाबेस में देखा है, आप एक अतिरिक्त बच्चे का उपयोग कर रहे हैं जिसकी मुझे व्यक्तिगत रूप से आवश्यकता नहीं है। सादगी के लिए, मैं आपको निम्नलिखित डेटाबेस संरचना का उपयोग करने की सलाह देता हूं:

Firebase-root
   |
   --- users
         |
         --- uid
              |
              --- Email: "egor@gmail.com"
              |
              --- Name: "Egor"
              |
              --- Phone_num: "24365675"

देखिए, वह अतिरिक्त स्तर अब गायब है। एकल उपयोगकर्ता का डेटा प्राप्त करने के लिए, कृपया निम्नलिखित कोड का उपयोग करें:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        UserInformation uInfo = dataSnapshot.getValue(UserInformation.class);
        Log.d(TAG, uInfo.getName());
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

और यदि आप सभी उपयोगकर्ताओं से डेटा प्राप्त करना चाहते हैं, तो कृपया निम्नलिखित कोड का उपयोग करें:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            UserInformation uInfo = ds.getValue(UserInformation.class);
            Log.d(TAG, uInfo.getName());
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
usersRef.addListenerForSingleValueEvent(valueEventListener);

आपके कोड में एक और समस्या यह है कि आप अपने मॉडल क्लास फ़ील्ड में उपयोग कर रहे हैं जो बड़े अक्षर से शुरू होता है न कि लोअरकेस अक्षर से। जब आप getName() नाम के गेट्टर का उपयोग कर रहे होते हैं, तो Firebase name नाम की फ़ील्ड ढूंढ रहा होता है, न कि Name। लोअरकेस n अक्षर बनाम कैपिटल लेटर N देखें? तो यह शायद आपको परेशानी का कारण बनेगा। आपका मॉडल वर्ग जिस तरह दिखना चाहिए उसका सही तरीका यह है:

public class UserInformation {
    private String name, email, phoneNum;

    public UserInformation() {}

    public UserInformation(String name, String email, String phoneNum) {
        this.name = name;
        this.email = email;
        this.phoneNum = phoneNum;
    }

    public String getName() { return name; }
    public String getEmail() { return email; }
    public String getPhoneNum() { return phoneNum; }
}

अपना पुराना डेटा हटाएं, ताज़ा डेटा जोड़ें और सब कुछ ठीक हो जाएगा।

0
Alex Mamo 30 सितंबर 2018, 16:02