Я хочу искать переменные данные, используя базу данных Firebase.
Моя проблема. Я использую текст редактирования. Я хочу показать значение базы данных, которую я написал здесь, в виде текста. Мне удалось это сделать. Но под данными в моей базе данных есть данные с именем "имя", которые работают.
-L3131131313 112: "ambulans" имя: "ambulans"
Когда я звоню "112" с помощью Edit Text, это дает мне "скорую помощь". Но я хочу сделать это, когда нет базы данных с именем "имя".
Это то, что должно быть. Значение "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"
}
}
}
Мой CategoryItem.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;
}
}
Есть много способов решить эту проблему. Но решение варьируется в зависимости от сложности вашего набора данных.
Примечание: при работе с телефонными номерами необходимо следить за тем, чтобы они не интерпретировались Firebase как числа и вместо этого сохранялись как строки. Для простых телефонных номеров достаточно добавить "_"
в начале номера. Если вы хотите отличить эти номера от номеров с международными кодами вызывающих абонентов, вы можете заменить "_"
на "+"
.
например, "_5417543010" и "+15417543010" - это одно и то же число США.
Если вы только сопоставляете число со строкой (и наоборот), вы можете использовать следующую настройку:
{
"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");
}
Для сопоставления имени или номера телефона с контактом вы можете использовать следующую настройку:
{
"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");
}
Для сопоставления имени или номера телефона с контактом вы можете использовать следующую настройку:
{
"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");
}