我试图存储用户信息,例如NAME。但是我遇到了一些错误。搜索和应用方法,但我收到错误,logCat发布在下面。我能解决一下吗?
我想在其下添加一个名为“USERS”的新根和用户信息,就像用户个人资料一样。
但现在我只想添加用户名。
以下是一些代码......
“我的代码”
firebaseAuth = FirebaseAuth.getInstance();
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference();
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
Log.d(TAG, "onAuthStateChanged:signed_out");
}
}
};
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
Log.d(TAG, "Value is: " + value);
}
@Override
public void onCancelled(DatabaseError error) {
Log.w(TAG, "Failed to read value.", error.toException());
}
});
btn_save_edit_profile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String user_name_string = user_name_edit.getText().toString();
if (!user_name_string.equals("")){
FirebaseUser user = firebaseAuth.getCurrentUser();
String userID = user.getUid();
databaseReference.child(userID).child("Name").setValue(user_name_string);
Toast.makeText(ProfileEditActivity.this, "Saved Successfully!", Toast.LENGTH_SHORT).show();
}
}
});
logcat的
Process: com.sam.simple, PID: 23912
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.sam.simple.Project
at com.google.android.gms.internal.adw.zzb(Unknown Source)
at com.google.android.gms.internal.adw.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.sam.simple.FirebaseHelper.fetchData(FirebaseHelper.java:52)
at com.sam.simple.FirebaseHelper.access$000(FirebaseHelper.java:14)
at com.sam.simple.FirebaseHelper$1.onChildAdded(FirebaseHelper.java:65)
at com.google.android.gms.internal.uv.zza(Unknown Source)
at com.google.android.gms.internal.aaf.zzIo(Unknown Source)
at com.google.android.gms.internal.aal.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6918)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
输出要求
注意:是否因为我的“Project”root导致了任何问题?数据库可能指向主根和事物?我是新来的。任何帮助?感谢
更新#1:为项目添加了我的下一个数据快照,如果这可以进一步帮助吗?
DatabaseReference db;
Boolean saved = null;
ArrayList<Project> projects=new ArrayList<>();
public FirebaseHelper(DatabaseReference db) {
this.db = db;
}
//WRITE IF NOT NULL
public Boolean save(Project project)
{
if(project==null)
{
saved=false;
}
else
{
try
{
db.child("Project").push().setValue(project);
saved=true;
}catch (DatabaseException e)
{
e.printStackTrace();
saved=false;
}
}
return saved;
}
//IMPLEMENT FETCH DATA AND FILL ARRAYLIST
private void fetchData(DataSnapshot dataSnapshot)
{
projects.clear();
for (DataSnapshot ds : dataSnapshot.getChildren())
{
Project project = ds.getValue(Project.class);
projects.add(project);
}
}
//READ THEN RETURN ARRAYLIST
public ArrayList<Project> retrieve() {
/*Query queryreference = db.orderByChild("postedDate");*/
/*Query lastToFirstQuery = db.orderByChild("postedDate");*/
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return projects;
答案 0 :(得分:1)
请使用此代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String name = ds.child("Name").getValue(String.class);
Log.d("TAG", name);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);
对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。 即使只有一个结果,快照也会包含一个结果列表。
答案 1 :(得分:0)
无法作为一个相对较新的用户发表评论,但我最近也遇到了同样的问题。
请尝试将此行databaseReference.child(userID).child("Name").setValue(user_name_string);
更改为databaseReference.child("Users").child(userID).child("Name").setValue(user_name_string);
您的数据库引用正在引用整个数据库,因此添加.child("Users")
会将其缩小到您要添加到的特定节点。
同时确保您的User类与Firebase节点完美匹配。