android在实时数据库中的读写

android在实时数据库中的读写,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有一个用户类,它有一个联系人列表(朋友)。我想添加添加朋友的可能性 我的数据库 在我的代码中有一个addFriend方法,它调用checkUser方法。在这里,我检查该用户是否存在,以便将其添加到朋友列表中。我很难实现它,比如如何从匿名类检索变量 这是我的密码 package com.android.pfe.other; import android.support.annotation.Keep; import android.util.Log; import com.google.f

我有一个用户类,它有一个联系人列表(朋友)。我想添加添加朋友的可能性

我的数据库

在我的代码中有一个
addFriend
方法,它调用
checkUser
方法。在这里,我检查该用户是否存在,以便将其添加到朋友列表中。我很难实现它,比如如何从匿名类检索变量

这是我的密码

package com.android.pfe.other;

import android.support.annotation.Keep;
import android.util.Log;

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.IgnoreExtraProperties;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.io.Serializable;
import java.util.Hashtable;
import java.util.List;

/**
 * Created by SADA INFO on 13/04/2018.
 */
@IgnoreExtraProperties
@Keep
public class User implements Serializable {
    private static final String TAG ="UserClass" ;
    public String username;
    public String email;
    public Hashtable contact;
    public String Uid;
    public List article;
    public DatabaseReference mDatabase;
    public List<User> UserList;
    public User uti;
    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(com.android.pfe.other.User.class)
    }

    public User(String username, String email,String uid) {
        this.username = username;
        this.email = email;
        this.contact=new Hashtable<String,Boolean>();
        this.Uid=Uid;


    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void addUser(String UserId, String name, String email) {
        mDatabase = FirebaseDatabase.getInstance().getReference("User");
        User user = new User(name, email,UserId);
        mDatabase.child(UserId).setValue(user);

    }
    public void addFriend(String UserId, final String email)
    {
        mDatabase = FirebaseDatabase.getInstance().getReference("User");
        DatabaseReference user = mDatabase.child(UserId);
        final DatabaseReference friendlist = user.child("contact");

        if(checkUser(email)==true)
        friendlist.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Hashtable list = dataSnapshot.getValue(Hashtable.class);
                if(list.isEmpty())
                {
                    friendlist.setValue(email);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }
    public boolean checkUser(String email){
        Query query = FirebaseDatabase.getInstance().getReference("User").orderByChild("email").equalTo(email);
        query.addListenerForSingleValueEvent(mValueEventListener);
       if(uti==null)
       {
           return false;
       }
        return true;
    }

    ValueEventListener mValueEventListener=new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists())
        {
            uti=dataSnapshot.getValue(User.class);

        }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "loadUser:onCancelled", databaseError.toException());
        }
    };

} 
package com.android.pfe.other;
导入android.support.annotation.Keep;
导入android.util.Log;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.ignoreextroperties;
导入com.google.firebase.database.Query;
导入com.google.firebase.database.ValueEventListener;
导入java.io.Serializable;
导入java.util.Hashtable;
导入java.util.List;
/**
*由SADA INFO于2018年4月13日创建。
*/
@忽略外部属性
@保持
公共类用户实现可序列化{
私有静态最终字符串TAG=“UserClass”;
公共字符串用户名;
公共字符串电子邮件;
公共哈希表联系人;
公共字符串Uid;
公共物品清单;
公共数据库参考数据库;
公共列表用户列表;
公共用户uti;
公共用户(){
//调用DataSnapshot.getValue(com.android.pfe.other.User.class)所需的默认构造函数
}
公共用户(字符串用户名、字符串电子邮件、字符串uid){
this.username=用户名;
this.email=电子邮件;
this.contact=new Hashtable();
this.Uid=Uid;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
public void addUser(字符串UserId、字符串名称、字符串电子邮件){
mDatabase=FirebaseDatabase.getInstance().getReference(“用户”);
用户=新用户(名称、电子邮件、用户ID);
mDatabase.child(UserId).setValue(user);
}
public void addFriend(字符串用户ID,最终字符串电子邮件)
{
mDatabase=FirebaseDatabase.getInstance().getReference(“用户”);
DatabaseReference user=mDatabase.child(UserId);
最终数据库引用friendlist=user.child(“联系人”);
如果(检查用户(电子邮件)=true)
addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Hashtable list=dataSnapshot.getValue(Hashtable.class);
if(list.isEmpty())
{
friendlist.setValue(电子邮件);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
公共布尔校验用户(字符串电子邮件){
Query Query=FirebaseDatabase.getInstance().getReference(“用户”).orderByChild(“电子邮件”).equalTo(电子邮件);
query.addListenerForSingleValueEvent(mValueEventListener);
如果(uti==null)
{
返回false;
}
返回true;
}
ValueEventListener mValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot.exists())
{
uti=dataSnapshot.getValue(User.class);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
w(标记“loadUser:onCancelled”,databaseError.toException());
}
};
} 

我建议您使用onSuccess(DataSnapshot DataSnapshot)和onError(Exception e)方法定义一个接口,比如“ICheckUserListener”


然后,您可以在“addFriend”方法中实现“ICheckUserListener”来处理结果。

您可以提供领域数据库:异步加载Firebase的用户数据。当运行
if(uti==null)
时,数据尚未加载,因此它将始终为
null
。有关此主题的一些好答案,请参阅:、Doug's和new。
public void checkUser(String email, ICheckUserListener listener) 
//Since this method is independent of a specific User instance, it can be static which would require minor adjustments to prevent a memory-leak
{
    ValueEventListener mValueEventListener = new ValueEventListener() 
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
        {
            listener.success(dataSnapshot.exists() ? dataSnapshot : null);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) 
        {
            Log.w(TAG, "loadUser:onCancelled", databaseError.toException());
            listener.onError(databaseError.toException());
        }
    };

    FirebaseDatabase
       .getInstance()
       .getReference("User")
       .orderByChild("email") //This is redundant if email ids are unique
       .equalTo(email)
       .addListenerForSingleValueEvent(mValueEventListener);

}