Firebase-запрос не работает в andorid - PullRequest
0 голосов
/ 16 ноября 2018

Я столкнулся с очень запутанной проблемой в базе данных firebase, когда попытался запросить свое поле user_name, чтобы проверить, существует ли оно уже в базе данных или нет.Он работал раньше, но внезапно перестал работать ... Вот мой код:

 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) {

            }
        });

Я не знаю почему, но каждый раз, когда я запускаю его.Его поговорка «имя пользователя не существует», хотя на самом деле он существует в базе данных.

my firebase database

Я не знаю, что делать.Я думаю, что проблема началась, когда я обновил свою зависимость от firebase до «16.0.5»

Вот моя модель данных класса пользователей:

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

ОБНОВЛЕНИЕ: Iя получаю это предупреждение в моем поле "user_name":

"Использование неуказанного индекса. Ваши данные будут загружены и отфильтрованы на клиенте. Попробуйте добавить" .indexOn ":" user_name "'к пользователям в вашправила безопасности и базы данных Firebase для повышения производительности "

Это вызывает проблему ??Как я могу добавить indexOn

Решенная проблема: Я думаю, что ".indexOn" был проблемой, а также я использовал автономные функции Firebase и забыл синхронизировать конкретный узел, я просто сделал "nodeRefrence".keepSynced (true) "и теперь все работает ..

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В соответствии с вашим отредактированным вопросом:

"Использование неуказанного индекса. Ваши данные будут загружены и отфильтрованы на клиенте. Попробуйте добавить" .indexOn ":" user_name "'для пользователей вваши правила безопасности и базы данных Firebase для повышения производительности "

Похоже, вы не определили индекс для поля, к которому обращаетесь.Если индекс отсутствует, фильтрация на сервере невозможна.Таким образом, в этом случае сервер отправляет все данные клиенту, который выполняет фильтрацию.

Является ли это причиной проблемы?Как я могу добавить indexOn?

Если это действительно является причиной вашей проблемы, вы можете исправить ее, добавив индекс в ваш файл правил.Зная, что вы заказываете узел users для свойства с именем user_name, вы должны использовать следующие строки кода:

{
  "rules": {
    "users": {
      ".indexOn": "user_name"
    }
  }
}

Для получения дополнительной информации по этой теме я рекомендую вам ознакомиться с официальной документацией, касающейся индексирование данных в Firebase .

0 голосов
/ 16 ноября 2018

передать идентификатор в запрос следующим образом ..

 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) {

        }
    });

}

дополнительную информацию смотрите по этой ссылке https://www.androidhive.info/2016/10/android-working-with-firebase-realtime-database/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...