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);
}