Как мне создать переменную имя базы данных firebase? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу найти переменные данные, используя базу данных Firebase.

Моя проблема.Я использую текст редактирования.Я хочу показать значение базы данных, которую я написал здесь, в виде текста.Мне удалось это сделать.Но под данными в моей базе данных есть данные с именем «name», которые работают.

-L3131131313 112: «ambulans» name: «ambulans»

Когда я звоню «112» сРедактировать текст, это дает мне «скорую помощь».Но я хочу сделать это, когда нет базы данных с именем «name».

Это то, что должно быть.Значение «112» должно быть «Скорая помощь».

-L3131131313 112: «Скорая помощь»

Значение «112» будет непрерывно изменяемым.Например, «110», «200», «352» и т. Д. Я хотел бы видеть значение, противоположное данным, которые я запрашиваю, с помощью Редактировать текст, но мне не удалось.Я был бы признателен, если бы вы могли помочь.Извините за мой плохой английский.

Моя база данных фото;[https://i.hizliresim.com/jgor3W.png][1]

public class MainActivity extends AppCompatActivity {

EditText Search_Edit_Text;
Button Search_Button;
RecyclerView Search_Contact_List;

DatabaseReference mUserDatabase;

FirebaseRecyclerOptions<CategoryItem> options,options2;
FirebaseRecyclerAdapter<CategoryItem,CategoryViewHolder> adapter;

Query firebaseSearchQuery;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("database");

    Search_Edit_Text = (EditText) findViewById(R.id.Search_Edit_Text);
    Search_Button = (Button) findViewById(R.id.Search_Button);

    Search_Contact_List = (RecyclerView) findViewById(R.id.Search_Contact_List);
    Search_Contact_List.setHasFixedSize(true);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getBaseContext(),2);
    Search_Contact_List.setLayoutManager(gridLayoutManager);

    Search_Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String searchText = Search_Edit_Text.getText().toString();

            firebaseUserSearch(searchText);
        }
    });

    private void firebaseUserSearch(String searchText) {


    Toast.makeText(MainActivity.this, "Started Search", 
    Toast.LENGTH_LONG).show();

    firebaseSearchQuery = mUserDatabase.orderByChild(searchText).startAt("").endAt("" + "\uf8ff");

    options2 = new FirebaseRecyclerOptions.Builder<CategoryItem>()
            .setQuery(firebaseSearchQuery,CategoryItem.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<CategoryItem, 
    CategoryViewHolder>(options2) {
        @Override
        protected void onBindViewHolder(@NonNull final CategoryViewHolder holder, int position, @NonNull final CategoryItem model) {

        }


        @NonNull
        @Override
        public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_layout,parent,false);
            return new CategoryViewHolder(itemView);

        }
    };

    setCategory();
}

private void setCategory() {

    adapter.startListening();
    Search_Contact_List.setAdapter(adapter);
}

Элемент моей категории

public class CategoryItem {

public String name;



public CategoryItem() {
}

public CategoryItem(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

ОБНОВЛЕНИЕ

Я решил некоторые из своих проблем.Пример базы данных, которую я буду использовать, выглядит следующим образом.Сейчас я хочу это сделать, но не могу найти решение.

В нашей базе данных будет два или более набора вспомогательных баз данных.Например, я буду использовать это имя базы данных "+90 505 696 1234" дважды.Значением этой базы данных является «А», а значением «АА» в другом наборе.Когда я звоню на этот номер телефона с помощью Редактировать текст, я хочу, чтобы он дал мне значения «А» и «АА».Но я не могу это сделать.Потому что созданный мной класс CategoryItem не является переменной.Я использовал имя в качестве строкового значения в CategoryItem.Я вызываю это с getName ().Но если это значение зафиксировано, оно работает.Я не могу найти решение, потому что пользователь будет искать различные имена баз данных с помощью редактирования текста.Я буду очень рад, если вы сможете помочь.

Моя база данных Firebase

{
  "ContactPhoneNumbers" : {
    "-LcaHYcsoGA-VT8yvgGf" : {
      "+90 505 696 1234" : "A",
      "+90 506 854 2345" : "B",
      "+90 530 408 3456" : "C",
      "+90 535 966 4567" : "D",
      "+90 536 782 5678" : "E",
      "+90 546 934 67 89" : "F",
      "+905304080001" : "G",
      "+905316910002" : "H",
      "+905359660003" : "I",
      "+905367820004" : "J",
      "+905425420005" : "K",
      "+905469340006" : "L",
      "05056960007" : "M"
    },
    "-LcaH_gtgarJwbY5-C08" : {
      "+90 505 696 1234" : "AA",
      "+90 506 854 2345" : "BB",
      "+90 530 408 3456" : "CAC",
      "+90 535 966 4567" : "AAA",
      "+90 536 782 5678" : "CAB",
      "+90 546 934 67 89" : "BB",
      "+905304080001" : "A",
      "+905316910002" : "BBB",
      "+905359660003" : "DDD",
      "+905367820004" : "EEE",
      "+905425420005" : "FFF",
      "+905469340006" : "L",
      "05056960007" : "M"
    }
  }
}

Моя категорияItem.java

public class CategoryItem {

    public String name ;

    public CategoryItem() {

    }

    public CategoryItem(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

1 Ответ

2 голосов
/ 16 апреля 2019

Есть много способов решить вашу проблему.Но решение может варьироваться в зависимости от сложности вашего набора данных.

Примечание: при работе с телефонными номерами необходимо следить за тем, чтобы они не интерпретировались Firebase как числа и вместо этого сохранялиськак строки.Для простых телефонных номеров достаточно добавить "_" в начале номера.Если вы хотите отличить эти номера от номеров с международными кодами вызывающих абонентов, вы можете заменить "_" на "+".

, например, "_5417543010" и "+15417543010" - это один и тот же номер США.

Решение 1: двусторонняя карта

Если вы сопоставляете число только со строкой (и наоборот), вы можете использовать следующую настройку:

Структура базы данных:

{
  "ContactPhoneNumbers": {
    "_110": "fireman",
    "_112": "ambulance",
    "_155": "police",
    "_ambulance": "_112",
    "_fireman": "_110",
    "_police": "_155"
  }
}

Код:

private Query firebaseSearchQueryContacts(String searchText) {
  // will return all entries that start with value of "searchText"
  return mUserDatabase.child("ContactPhoneNumbers").startAt("_" + searchText).endAt("_" + searchText + "\uf8ff");
}

Проблемы:

  • Номера телефонов должны быть уникальными.Не будет работать для таких случаев, как «911» (США) и «000» (AU).
  • Необходимо добавить «_» в начало каждого сохраненного ключа, чтобы обеспечить правильную работу поиска.

Решение 2. Дочерние объекты

Для сопоставления имени или номера телефона с контактом вы можете использовать следующую настройку:

Структура базы данных:

{
  "ContactPhoneNumbers": {
    "L213213213232321321": {
      "name": "police",
      "phone": "_155"
    },
    "L312312312": {
      "name": "fireman",
      "phone": "_110"
    },
    "L3131131313": {
      "name": "ambulance",
      "phone": "_112"
    }
  }
}

Код:

private Query firebaseSearchQueryContactsByPhone(String phone) {
  // will return all entries that have a phone number that starts with value of "phone"
  return mUserDatabase.child("ContactPhoneNumbers").orderByChild("phone").startAt("_" + phone).endAt("_" + phone + "\uf8ff");
}

private Query firebaseSearchQueryContactsByName(String name) {
  // will return all entries that have a name that starts with value of "name"
  return mUserDatabase.child("ContactPhoneNumbers").orderByChild("name").startAt(name).endAt(name + "\uf8ff");
}

Проблемы:

  • Необходимо запросить телефон и имя отдельно.

Решение 3. Дочерние объекты с индексом поиска

Для сопоставления имени или номера телефона с контактом вы можете использовать следующую настройку:

Структура базы данных:

{
  "ContactPhoneNumbers": {
    "L213213213232321321": {
      "name": "police",
      "phone": "_155"
    },
    "L312312312": {
      "name": "fireman",
      "phone": "_110"
    },
    "L3131131313": {
      "name": "ambulance",
      "phone": "_112"
    }
  },
  "ContactPhoneNumbersIndex"" {
    "_110": "L312312312",
    "_112": "L3131131313",
    "_155": "L213213213232321321",
    "_fireman": "L312312312",
    "_ambulance": "L3131131313",
    "_police": "L213213213232321321"
  }
}

Код:

private Query firebaseSearchQueryContactEntriesByPhone(String phone) {
  // will return all entries that have a phone number that starts with value of "phone"
  return mUserDatabase.child("ContactPhoneNumbers").orderByChild("phone").startAt("_" + phone).endAt("_" + phone + "\uf8ff");
}

private Query firebaseSearchQueryContactEntriesByName(String name) {
  // will return all entries that have a name that starts with value of "name"
  return mUserDatabase.child("ContactPhoneNumbers").orderByChild("name").startAt(name).endAt(name + "\uf8ff");
}

private Query firebaseSearchQueryContactID(String searchText) {
  // will return all IDs that have a phone/name value that starts with value of "searchText"
  return mUserDatabase.child("ContactPhoneNumbersIndex").startAt("_" + searchText).endAt("_" + searchText + "\uf8ff");
}

Проблемы:

  • Поиск по имени и номеру одновременно возвращает список идентификаторов контактов, а не записи контактов.Затем они должны быть прочитаны с сервера отдельно.
  • Необходимо добавить «_» в начало каждого ключа, сохраненного в индексе, чтобы обеспечить правильную работу поиска.
  • Индекс требует синхронизациис сохраненными контактами.Рассмотрите возможность использования облачной функции для этой задачи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...