Я борюсь с Firestore, потому что не хватает документации, которая может описать все возможные сценарии работы Firestore.
Позвольте мне объяснить мои требования.
У меня есть следующий графический интерфейсв андроиде:
- EditText.(Имя)
- Спиннер.(города)
- Спиннер.(Автобусы)
- Кнопка добавления
В Firestore имеются следующие коллекции:
- города (содержащие несколько городов)
- busses (которые содержат несколько шин)
- user (который будет содержать имя пользователя, ссылку на шину, ссылку на город)
Теперь проблема заключается в том, что когда пользователь нажимает на кнопку AddКнопка, сначала я должен получить ссылку на selected city
и selected bus
, затем добавить эти три значения в коллекцию user
, но чтобы получить ссылку, я должен вызвать следующий код.
final Map<String, Object> data = new HashMap<>();
data.put("username", editText.getText().toString());
db.collection("cities")
.whereEqualTo("name", city) // get city by name
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot query) {
data.put("city", query.getDocuments().get(0).getReference());
// once the city reference got, then get the Buss reference
db.collection("busses")
.whereEqualTo("busnumber", bus) // get bus by number
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot query) {
data.put("bus", query.getDocuments().get(0).getReference());
addData(data); // now the city and bus reference got, add the data now.
}
});
}
});
Это делает приложение немного медленным и выглядит глупо, я хочу подтвердить, что это правильный подход?или есть лучший способ сделать это?или в будущем, возможно, мне придется получить больше ссылок, чем больше вложенных вызовов?
Отредактировано
Более того, это действительно глупый способ вспомнить эти кодыснова и снова, чтобы получить ссылку city
или bus
, поэтому в моем приложении будет много дублирования, что не очень хорошо.Поэтому я хочу создать два метода getCityRefByName(String name)
и getBusRefByNUmber(int number)
следующим образом.
public DocumentReference getBusByNumber(int number){
db.collection("busses")
.whereEqualTo("busname", number)
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot query) {
query.getDocuments().get(0).getReference(); // return this reference, How?
}
});
}
public DocumentReference getCityRefByName(String name){
db.collection("cities")
.whereEqualTo("name", name)
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot query) {
query.getDocuments().get(0).getReference(); // return this reference, How?
}
});
}
Документация Firestore недостаточно хороша, поэтому я сталкиваюсь с этими глупыми проблемами с ядром.