Java Firebase查询不支持';他似乎在安道尔工作
当我试图查询我的用户名字段以检查它是否已经存在于数据库中时,我在firebase数据库中面临一个非常棘手的问题。它之前还在工作,但突然停止了工作。。。这是我的密码:Java Firebase查询不支持';他似乎在安道尔工作,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,当我试图查询我的用户名字段以检查它是否已经存在于数据库中时,我在firebase数据库中面临一个非常棘手的问题。它之前还在工作,但突然停止了工作。。。这是我的密码: Query query = myRef.child(getString(R.string.usersNode)).orderByChild("user_name").equalTo("codeni8"); query.addListenerForSingleValueEvent(new ValueEventList
Query query = myRef.child(getString(R.string.usersNode)).orderByChild("user_name").equalTo("codeni8");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
Log.d(TAG,"username already exist");
}else {
Log.d(TAG,"username does't exist");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
我不知道为什么,但每次我运行它。它说“用户名不存在”,即使它实际上存在于数据库中
我不知道该怎么办。我想问题开始了
当我将firebase依赖项更新为“16.0.5”时
以下是我的users类数据模型:
public class Users {
private String user_id;
private String user_name;
private String display_name;
private String email;
private String profile_photo;
private String cover_photo;
private String bio;
private String website;
private long posts;
private long followers;
private long following;
private String phone_no;
private String gender;
public Users() {
}
public Users(String user_id, String user_name, String display_name, String email, String profile_photo, String cover_photo, String bio, String website, long posts, long followers, long following, String phone_no, String gender) {
this.user_id = user_id;
this.user_name = user_name;
this.display_name = display_name;
this.email = email;
this.profile_photo = profile_photo;
this.cover_photo = cover_photo;
this.bio = bio;
this.website = website;
this.posts = posts;
this.followers = followers;
this.following = following;
this.phone_no = phone_no;
this.gender = gender;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getDisplay_name() {
return display_name;
}
public void setDisplay_name(String display_name) {
this.display_name = display_name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProfile_photo() {
return profile_photo;
}
public void setProfile_photo(String profile_photo) {
this.profile_photo = profile_photo;
}
public String getCover_photo() {
return cover_photo;
}
public void setCover_photo(String cover_photo) {
this.cover_photo = cover_photo;
}
public String getBio() {
return bio;
}
public void setBio(String bio) {
this.bio = bio;
}
public String getWebsite() { return website; }
public void setWebsite(String website) { this.website = website; }
public long getPosts() {
return posts;
}
public void setPosts(long posts) {
this.posts = posts;
}
public long getFollowers() {
return followers;
}
public void setFollowers(long followers) {
this.followers = followers;
}
public long getFollowing() {
return following;
}
public void setFollowing(long following) {
this.following = following;
}
public String getPhone_no() {
return phone_no;
}
public void setPhone_no(String phone_no) {
this.phone_no = phone_no;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
更新:
我在“用户名”字段中收到以下警告:
使用一个未指定的索引。您的数据将在客户端上下载和过滤。考虑添加“.index”:用户的“用户名称”到您的安全和FixBASE数据库规则以获得更好的性能“< /P>” 这是问题的根源吗??如何添加indexOn
问题已解决:我认为“.indexOn”是问题所在,而且我使用了firebase脱机功能,忘记了同步特定节点,我只是执行了“nodeRefrence.keepSynced(true)”操作,现在一切都正常了。以这种方式将id传递到查询中
String userId = mFirebaseDatabase.push().getKey();
myRef.child(getString(R.string.usersNode)).child(userId).orderByChild("user_name").equalTo("codeni8");
试试这个方法这对我很有效
private void initView() {
mFirebaseInstance = FirebaseDatabase.getInstance();
mDatabase = mFirebaseInstance.getReference("usersDb/UserTable");
mRvData = findViewById(R.id.rvData);
mTvEmpty = findViewById(R.id.dlTvEmpty);
mRvData.setLayoutManager(new LinearLayoutManager(this));
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mUserList.clear();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
// here check id that available or not into db.
User user = dataSnapshot1.getValue(User.class);
mUserList.add(user);
}
allDataAdapter = new DisplayAllData(DisplayActivity.this, mUserList);
mRvData.setAdapter(allDataAdapter);
allDataAdapter.notifyDataSetChanged();
if (mUserList.isEmpty())
mTvEmpty.setVisibility(View.VISIBLE);
else
mTvEmpty.setVisibility(View.GONE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
更多信息请参阅此链接
根据您编辑的问题:
使用一个未指定的索引。您的数据将在客户端上下载和过滤。考虑添加“.index”:用户的“用户名称”到您的安全和FixBASE数据库规则以获得更好的性能“< /P>” 听起来您可能没有在要查询的字段上定义索引。如果没有索引,则无法在服务器上执行筛选。因此,在这种情况下,服务器将所有数据发送到客户端,客户端执行过滤
这是问题的根源吗?如何添加indexOn 如果这确实是问题的原因,您可以通过在规则文件中添加索引来修复它。知道您正在对名为user\u name
的属性上的users
节点进行排序,您应该使用以下代码行:
{
"rules": {
"users": {
".indexOn": "user_name"
}
}
}
有关此主题的更多信息,我建议您查看有关的官方文档。我不只是在特定uid中搜索wana。我想在整个数据库中搜索这个用户名…我添加了一个方法initview()检查这个方法它的帮助是否完整。这很奇怪,从现在开始它一直在发生,或者它只是第一次发生?不总是…在同一个应用程序中,它工作了,但在将firebase依赖性更新为16.0.5之后,它似乎不工作。
myRef
的值是多少?getString(R.string.usersNode)
返回什么?请同时回复@AlexMamo@AlexMamomyRef是数据库的根引用,usersNode是节点“users”。您是否尝试打印dataSnapshot
的内容?里面的数据是什么?我更新了我的rulles:{/*访问以了解更多关于安全规则的信息。*/“规则”:{.read:“auth!=null”,“write:“auth!=null”,“users:{.indexOn:[“user\u name”,“email”]}}}。但是问题仍然是坚持只使用这个。.indexOn:“user\u name”
,它是这样工作的吗?这是不起作用的,但是这个警告>代码>使用一个未指定的索引。您的数据将在客户端上下载和过滤。考虑添加“.index”:“用户名称”< /代码>它仍然显示。警告很好地听到,另一个问题得到解决,但仍然不是最初的问题。