Anonymous
Реорганизация коллекции Firestore и настройка API
Сообщение
Anonymous » 28 окт 2024, 03:22
Я пытаюсь изменить структуру Firestore следующим образом:
Код: Выделить всё
Root: events/{selectedSport}/leagues/{selectedLeague}/seasons/{selectedSeason}/matchdays/{idEvent} (idEvent, strEvent, strSeason, dateEvent, strTime, idHomeTeam, idAwayTeam, strHomeTeam, strAwayTeam, intHomeScore, intAwayScore, strVenue, strStatus, strPostponed, strThumb, strVideo)
к этому
Код: Выделить всё
Root: events/{LeagueName: league name, selectedLeagueId}/seasons/{SeasonName: seasonID}/matchdays/{Matchday: matchdayID}/matches/{Match: matchID} (idEvent, strEvent, strSeason, dateEvent, strTime, idHomeTeam, idAwayTeam, strHomeTeam, strAwayTeam, intHomeScore, intAwayScore, strVenue, strStatus, strPostponed, strThumb, strVideo, order of arrival)`
но API
https://www.thesportsdb.com/ не вызывает matchday. Но чтобы создать день матча, я хочу добавить strMatchday в качестве дополнительного параметра в вызов API, предполагая, что конечная точка API TheSportsDB поддерживает фильтрацию по дню матча. Это не всегда стандартно, но вы можете добавить это к этому:
Код: Выделить всё
String url = "https://www.thesportsdb.com/api/v1/json/xxx/eventsseason.php?id="
+ selectedLeagueId + "&s=" + season + "&round=" + strMatchday;
поэтому мне позвонили «Событие»
Код: Выделить всё
public class Event {
private String sport;
private String league;
private String season;
private String matchday;
из приведенной ниже Java
Код: Выделить всё
// Default constructor required for Firestore
public Event() {}
public Event(String sport, String league, String season, String matchday) {
this.sport = sport;
this.league = league;
this.season = season;
this.matchday = matchday;
}
public String getSport() {
return sport;
}
public void setSport(String sport) {
this.sport = sport;
}
public String getLeague() {
return league;
}
public void setLeague(String league) {
this.league = league;
}
public String getSeason() {
return season;
}
public void setSeason(String season) {
this.season = season;
}
public String getMatchday() {
return matchday;
}
public void setMatchday(String matchday) {
this.matchday = matchday;
}
и это код, который у меня сейчас есть, который необходимо изменить, как указано в начале вопроса. вы можете помочь?
Код: Выделить всё
import android.os.Bundle;
import android.util.Log;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.Request;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import com.google.firebase.firestore.FirebaseFirestore;
public class PullingActivity extends AppCompatActivity {
private Spinner spinnerSports;
private Spinner spinnerLeagues;
private Spinner spinnerSeasons;
private Button btnConfirmLeague;
private Button btnFetchData;
private FirebaseFirestore db;
private ArrayList sportsList = new ArrayList();
private ArrayList leaguesList = new ArrayList();
private ArrayList filteredLeaguesList = new ArrayList();
private ArrayList seasonsList = new ArrayList();
private ArrayList leagueIDsList = new ArrayList();
private static final String TAG = "PullingActivity";
private static final String BASE_URL = "https://www.thesportsdb.com/api/v1/json/xxx/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pulling);
spinnerSports = findViewById(R.id.spinner_sports);
spinnerLeagues = findViewById(R.id.spinner_leagues);
spinnerSeasons = findViewById(R.id.spinner_seasons);
btnConfirmLeague = findViewById(R.id.btn_confirm_league);
btnFetchData = findViewById(R.id.btn_fetch_data);
// Initialize Firebase Firestore
db = FirebaseFirestore.getInstance();
if (db == null) {
Toast.makeText(this, "Failed to initialize Firebase Firestore", Toast.LENGTH_SHORT).show();
Log.e(TAG, "Firebase Firestore instance is null.");
return; // Exit the onCreate method if Firestore initialization failed
}
loadSports();
// Fetch data button action
btnFetchData.setOnClickListener(v -> {
String selectedSport = (String) spinnerSports.getSelectedItem();
String selectedLeague = (String) spinnerLeagues.getSelectedItem();
String selectedSeason = (String) spinnerSeasons.getSelectedItem();
String selectedLeagueID = leagueIDsList.get(spinnerLeagues.getSelectedItemPosition());
if (selectedSport != null && selectedLeague != null && selectedSeason != null) {
fetchEvents(selectedLeagueID, selectedSeason);
} else {
Toast.makeText(PullingActivity.this, "Please select sport, league, and season first", Toast.LENGTH_SHORT).show();
}
});
spinnerSports.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, android.view.View view, int position, long id) {
String selectedSport = sportsList.get(position);
loadLeagues(selectedSport);
}
@Override
public void onNothingSelected(AdapterView parent) {}
});
btnConfirmLeague.setOnClickListener(v -> {
int selectedLeaguePosition = spinnerLeagues.getSelectedItemPosition();
if (selectedLeaguePosition >= 0) {
String selectedLeagueID = leagueIDsList.get(selectedLeaguePosition);
Log.d(TAG, "Selected League ID: " + selectedLeagueID); // Log selected league ID
loadSeasons(selectedLeagueID); // Pass the league ID to loadSeasons
} else {
Toast.makeText(PullingActivity.this, "Please select a league first", Toast.LENGTH_SHORT).show();
}
});
}
private void loadSports() {
String url = BASE_URL + "all_sports.php";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null,
response -> {
try {
JSONArray sportsArray = response.getJSONArray("sports");
for (int i = 0; i < sportsArray.length(); i++) {
JSONObject sport = sportsArray.getJSONObject(i);
String sportName = sport.getString("strSport");
sportsList.add(sportName);
}
ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this,
android.R.layout.simple_spinner_item, sportsList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSports.setAdapter(adapter);
} catch (JSONException e) {
Toast.makeText(PullingActivity.this, "Error loading sports", Toast.LENGTH_SHORT).show();
Log.e(TAG, "JSON parsing error in loadSports: ", e);
}
}, error -> {
Toast.makeText(PullingActivity.this, "Network Error in loadSports", Toast.LENGTH_SHORT).show();
Log.e(TAG, "Volley error in loadSports: ", error);
});
Volley.newRequestQueue(this).add(jsonObjectRequest);
}
private void loadLeagues(String sport) {
leaguesList.clear();
filteredLeaguesList.clear();
leagueIDsList.clear();
String url = BASE_URL + "all_leagues.php";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null,
response -> {
try {
JSONArray leaguesArray = response.getJSONArray("leagues");
for (int i = 0; i < leaguesArray.length(); i++) {
JSONObject league = leaguesArray.getJSONObject(i);
if (league.has("strSport") && league.getString("strSport").equals(sport)) {
String leagueName = league.getString("strLeague");
String leagueID = league.getString("idLeague");
leaguesList.add(leagueName);
filteredLeaguesList.add(leagueName);
leagueIDsList.add(leagueID); // Store the league ID
Log.d(TAG, "Added League: " + leagueName + " with ID: " + leagueID);
}
}
ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this,
android.R.layout.simple_spinner_item, leaguesList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerLeagues.setAdapter(adapter);
} catch (JSONException e) {
Toast.makeText(PullingActivity.this, "Error loading leagues", Toast.LENGTH_SHORT).show();
Log.e(TAG, "JSON parsing error in loadLeagues: ", e);
}
}, error -> {
Toast.makeText(PullingActivity.this, "Network Error in loadLeagues", Toast.LENGTH_SHORT).show();
Log.e(TAG, "Volley error in loadLeagues: ", error);
}
);
Volley.newRequestQueue(this).add(jsonObjectRequest);
}
private void loadSeasons(String leagueID) {
seasonsList.clear();
String url = BASE_URL + "search_all_seasons.php?id=" + leagueID;
Log.d(TAG, "Fetching seasons from URL: " + url); // Log the URL being requested
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null,
response -> {
Log.d(TAG, "Seasons API Response: " + response.toString()); // Log the full response
try {
if (response.has("seasons") && response.get("seasons") instanceof JSONArray) {
JSONArray seasonsArray = response.getJSONArray("seasons");
if (seasonsArray.length() == 0) {
Log.w(TAG, "No seasons found for league ID: " + leagueID);
Toast.makeText(PullingActivity.this, "No seasons available for the selected league", Toast.LENGTH_SHORT).show();
} else {
for (int i = 0; i < seasonsArray.length(); i++) {
JSONObject season = seasonsArray.getJSONObject(i);
String seasonName = season.getString("strSeason");
seasonsList.add(seasonName);
}
ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this,
android.R.layout.simple_spinner_item, seasonsList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSeasons.setAdapter(adapter);
}
} else {
Log.e(TAG, "Invalid or unexpected seasons array for league ID: " + leagueID);
Toast.makeText(PullingActivity.this, "No seasons available for the selected league", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
Log.e(TAG, "JSON parsing error in loadSeasons: ", e);
Toast.makeText(PullingActivity.this, "Error loading seasons", Toast.LENGTH_SHORT).show();
}
}, error -> {
Log.e(TAG, "Network error in loadSeasons: ", error);
Toast.makeText(PullingActivity.this, "Network Error in loadSeasons", Toast.LENGTH_SHORT).show();
}
);
Volley.newRequestQueue(this).add(jsonObjectRequest);
}
private void fetchEvents(String leagueID, String season) {
String url = BASE_URL + "eventsseason.php?id=" + leagueID + "&s=" + season;
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null,
response -> {
try {
JSONArray eventsArray = response.getJSONArray("events");
for (int i = 0; i < eventsArray.length(); i++) {
JSONObject event = eventsArray.getJSONObject(i);
// Parse the fields
String idEvent = event.optString("idEvent");
String strEvent = event.optString("strEvent");
String strSeason = event.optString("strSeason");
String dateEvent = event.optString("dateEvent");
String strTime = event.optString("strTime");
String idHomeTeam = event.optString("idHomeTeam");
String idAwayTeam = event.optString("idAwayTeam");
String strHomeTeam = event.optString("strHomeTeam");
String strAwayTeam = event.optString("strAwayTeam");
String intHomeScore = event.optString("intHomeScore");
String intAwayScore = event.optString("intAwayScore");
String strVenue = event.optString("strVenue");
String strStatus = event.optString("strStatus");
String strPostponed = event.optString("strPostponed");
String strThumb = event.optString("strThumb");
String strVideo = event.optString("strVideo");
// Create a map for the event data
HashMap eventMap = new HashMap();
eventMap.put("idEvent", idEvent);
eventMap.put("strEvent", strEvent);
eventMap.put("strSeason", strSeason);
eventMap.put("dateEvent", dateEvent);
eventMap.put("strTime", strTime);
eventMap.put("idHomeTeam", idHomeTeam);
eventMap.put("idAwayTeam", idAwayTeam);
eventMap.put("strHomeTeam", strHomeTeam);
eventMap.put("strAwayTeam", strAwayTeam);
eventMap.put("intHomeScore", intHomeScore);
eventMap.put("intAwayScore", intAwayScore);
eventMap.put("strVenue", strVenue);
eventMap.put("strStatus", strStatus);
eventMap.put("strPostponed", strPostponed);
eventMap.put("strThumb", strThumb);
eventMap.put("strVideo", strVideo);
// Store event in Firestore under the appropriate path
String selectedSport = (String) spinnerSports.getSelectedItem(); // Get the selected sport's name
String selectedLeague = (String) spinnerLeagues.getSelectedItem(); // Get the selected league's name
db.collection("events").document(selectedSport)
.collection("leagues").document(selectedLeague)
.collection("seasons").document(season)
.collection("matchdays")
.document(idEvent) // Use unique ID to avoid overwriting
.set(eventMap) // Store the event data
.addOnSuccessListener(aVoid ->
Log.d(TAG, "Event saved successfully"))
.addOnFailureListener(e ->
Log.e(TAG, "Error saving event data", e));
}
} catch (JSONException e) {
Log.e(TAG, "JSON parsing error in fetchEvents: ", e);
}
}, error -> {
Log.e(TAG, "Network error in fetchEvents: ", error);
}
);
Volley.newRequestQueue(this).add(jsonObjectRequest);
}
}
Я меняю ключ API на «xxx» для защиты.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... adjustment
1730074942
Anonymous
Я пытаюсь изменить структуру Firestore следующим образом: [code]Root: events/{selectedSport}/leagues/{selectedLeague}/seasons/{selectedSeason}/matchdays/{idEvent} (idEvent, strEvent, strSeason, dateEvent, strTime, idHomeTeam, idAwayTeam, strHomeTeam, strAwayTeam, intHomeScore, intAwayScore, strVenue, strStatus, strPostponed, strThumb, strVideo) [/code] к этому [code]Root: events/{LeagueName: league name, selectedLeagueId}/seasons/{SeasonName: seasonID}/matchdays/{Matchday: matchdayID}/matches/{Match: matchID} (idEvent, strEvent, strSeason, dateEvent, strTime, idHomeTeam, idAwayTeam, strHomeTeam, strAwayTeam, intHomeScore, intAwayScore, strVenue, strStatus, strPostponed, strThumb, strVideo, order of arrival)` [/code] но API https://www.thesportsdb.com/ не вызывает matchday. Но чтобы создать день матча, я хочу добавить strMatchday в качестве дополнительного параметра в вызов API, предполагая, что конечная точка API TheSportsDB поддерживает фильтрацию по дню матча. Это не всегда стандартно, но вы можете добавить это к этому: [code]String url = "https://www.thesportsdb.com/api/v1/json/xxx/eventsseason.php?id=" + selectedLeagueId + "&s=" + season + "&round=" + strMatchday; [/code] поэтому мне позвонили «Событие» [code]public class Event { private String sport; private String league; private String season; private String matchday; [/code] из приведенной ниже Java [code]// Default constructor required for Firestore public Event() {} public Event(String sport, String league, String season, String matchday) { this.sport = sport; this.league = league; this.season = season; this.matchday = matchday; } public String getSport() { return sport; } public void setSport(String sport) { this.sport = sport; } public String getLeague() { return league; } public void setLeague(String league) { this.league = league; } public String getSeason() { return season; } public void setSeason(String season) { this.season = season; } public String getMatchday() { return matchday; } public void setMatchday(String matchday) { this.matchday = matchday; } [/code] и это код, который у меня сейчас есть, который необходимо изменить, как указано в начале вопроса. вы можете помочь? [code]import android.os.Bundle; import android.util.Log; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.android.volley.Request; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import com.google.firebase.firestore.FirebaseFirestore; public class PullingActivity extends AppCompatActivity { private Spinner spinnerSports; private Spinner spinnerLeagues; private Spinner spinnerSeasons; private Button btnConfirmLeague; private Button btnFetchData; private FirebaseFirestore db; private ArrayList sportsList = new ArrayList(); private ArrayList leaguesList = new ArrayList(); private ArrayList filteredLeaguesList = new ArrayList(); private ArrayList seasonsList = new ArrayList(); private ArrayList leagueIDsList = new ArrayList(); private static final String TAG = "PullingActivity"; private static final String BASE_URL = "https://www.thesportsdb.com/api/v1/json/xxx/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pulling); spinnerSports = findViewById(R.id.spinner_sports); spinnerLeagues = findViewById(R.id.spinner_leagues); spinnerSeasons = findViewById(R.id.spinner_seasons); btnConfirmLeague = findViewById(R.id.btn_confirm_league); btnFetchData = findViewById(R.id.btn_fetch_data); // Initialize Firebase Firestore db = FirebaseFirestore.getInstance(); if (db == null) { Toast.makeText(this, "Failed to initialize Firebase Firestore", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Firebase Firestore instance is null."); return; // Exit the onCreate method if Firestore initialization failed } loadSports(); // Fetch data button action btnFetchData.setOnClickListener(v -> { String selectedSport = (String) spinnerSports.getSelectedItem(); String selectedLeague = (String) spinnerLeagues.getSelectedItem(); String selectedSeason = (String) spinnerSeasons.getSelectedItem(); String selectedLeagueID = leagueIDsList.get(spinnerLeagues.getSelectedItemPosition()); if (selectedSport != null && selectedLeague != null && selectedSeason != null) { fetchEvents(selectedLeagueID, selectedSeason); } else { Toast.makeText(PullingActivity.this, "Please select sport, league, and season first", Toast.LENGTH_SHORT).show(); } }); spinnerSports.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, android.view.View view, int position, long id) { String selectedSport = sportsList.get(position); loadLeagues(selectedSport); } @Override public void onNothingSelected(AdapterView parent) {} }); btnConfirmLeague.setOnClickListener(v -> { int selectedLeaguePosition = spinnerLeagues.getSelectedItemPosition(); if (selectedLeaguePosition >= 0) { String selectedLeagueID = leagueIDsList.get(selectedLeaguePosition); Log.d(TAG, "Selected League ID: " + selectedLeagueID); // Log selected league ID loadSeasons(selectedLeagueID); // Pass the league ID to loadSeasons } else { Toast.makeText(PullingActivity.this, "Please select a league first", Toast.LENGTH_SHORT).show(); } }); } private void loadSports() { String url = BASE_URL + "all_sports.php"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, response -> { try { JSONArray sportsArray = response.getJSONArray("sports"); for (int i = 0; i < sportsArray.length(); i++) { JSONObject sport = sportsArray.getJSONObject(i); String sportName = sport.getString("strSport"); sportsList.add(sportName); } ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this, android.R.layout.simple_spinner_item, sportsList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerSports.setAdapter(adapter); } catch (JSONException e) { Toast.makeText(PullingActivity.this, "Error loading sports", Toast.LENGTH_SHORT).show(); Log.e(TAG, "JSON parsing error in loadSports: ", e); } }, error -> { Toast.makeText(PullingActivity.this, "Network Error in loadSports", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Volley error in loadSports: ", error); }); Volley.newRequestQueue(this).add(jsonObjectRequest); } private void loadLeagues(String sport) { leaguesList.clear(); filteredLeaguesList.clear(); leagueIDsList.clear(); String url = BASE_URL + "all_leagues.php"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, response -> { try { JSONArray leaguesArray = response.getJSONArray("leagues"); for (int i = 0; i < leaguesArray.length(); i++) { JSONObject league = leaguesArray.getJSONObject(i); if (league.has("strSport") && league.getString("strSport").equals(sport)) { String leagueName = league.getString("strLeague"); String leagueID = league.getString("idLeague"); leaguesList.add(leagueName); filteredLeaguesList.add(leagueName); leagueIDsList.add(leagueID); // Store the league ID Log.d(TAG, "Added League: " + leagueName + " with ID: " + leagueID); } } ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this, android.R.layout.simple_spinner_item, leaguesList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerLeagues.setAdapter(adapter); } catch (JSONException e) { Toast.makeText(PullingActivity.this, "Error loading leagues", Toast.LENGTH_SHORT).show(); Log.e(TAG, "JSON parsing error in loadLeagues: ", e); } }, error -> { Toast.makeText(PullingActivity.this, "Network Error in loadLeagues", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Volley error in loadLeagues: ", error); } ); Volley.newRequestQueue(this).add(jsonObjectRequest); } private void loadSeasons(String leagueID) { seasonsList.clear(); String url = BASE_URL + "search_all_seasons.php?id=" + leagueID; Log.d(TAG, "Fetching seasons from URL: " + url); // Log the URL being requested JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, response -> { Log.d(TAG, "Seasons API Response: " + response.toString()); // Log the full response try { if (response.has("seasons") && response.get("seasons") instanceof JSONArray) { JSONArray seasonsArray = response.getJSONArray("seasons"); if (seasonsArray.length() == 0) { Log.w(TAG, "No seasons found for league ID: " + leagueID); Toast.makeText(PullingActivity.this, "No seasons available for the selected league", Toast.LENGTH_SHORT).show(); } else { for (int i = 0; i < seasonsArray.length(); i++) { JSONObject season = seasonsArray.getJSONObject(i); String seasonName = season.getString("strSeason"); seasonsList.add(seasonName); } ArrayAdapter adapter = new ArrayAdapter(PullingActivity.this, android.R.layout.simple_spinner_item, seasonsList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerSeasons.setAdapter(adapter); } } else { Log.e(TAG, "Invalid or unexpected seasons array for league ID: " + leagueID); Toast.makeText(PullingActivity.this, "No seasons available for the selected league", Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { Log.e(TAG, "JSON parsing error in loadSeasons: ", e); Toast.makeText(PullingActivity.this, "Error loading seasons", Toast.LENGTH_SHORT).show(); } }, error -> { Log.e(TAG, "Network error in loadSeasons: ", error); Toast.makeText(PullingActivity.this, "Network Error in loadSeasons", Toast.LENGTH_SHORT).show(); } ); Volley.newRequestQueue(this).add(jsonObjectRequest); } private void fetchEvents(String leagueID, String season) { String url = BASE_URL + "eventsseason.php?id=" + leagueID + "&s=" + season; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, response -> { try { JSONArray eventsArray = response.getJSONArray("events"); for (int i = 0; i < eventsArray.length(); i++) { JSONObject event = eventsArray.getJSONObject(i); // Parse the fields String idEvent = event.optString("idEvent"); String strEvent = event.optString("strEvent"); String strSeason = event.optString("strSeason"); String dateEvent = event.optString("dateEvent"); String strTime = event.optString("strTime"); String idHomeTeam = event.optString("idHomeTeam"); String idAwayTeam = event.optString("idAwayTeam"); String strHomeTeam = event.optString("strHomeTeam"); String strAwayTeam = event.optString("strAwayTeam"); String intHomeScore = event.optString("intHomeScore"); String intAwayScore = event.optString("intAwayScore"); String strVenue = event.optString("strVenue"); String strStatus = event.optString("strStatus"); String strPostponed = event.optString("strPostponed"); String strThumb = event.optString("strThumb"); String strVideo = event.optString("strVideo"); // Create a map for the event data HashMap eventMap = new HashMap(); eventMap.put("idEvent", idEvent); eventMap.put("strEvent", strEvent); eventMap.put("strSeason", strSeason); eventMap.put("dateEvent", dateEvent); eventMap.put("strTime", strTime); eventMap.put("idHomeTeam", idHomeTeam); eventMap.put("idAwayTeam", idAwayTeam); eventMap.put("strHomeTeam", strHomeTeam); eventMap.put("strAwayTeam", strAwayTeam); eventMap.put("intHomeScore", intHomeScore); eventMap.put("intAwayScore", intAwayScore); eventMap.put("strVenue", strVenue); eventMap.put("strStatus", strStatus); eventMap.put("strPostponed", strPostponed); eventMap.put("strThumb", strThumb); eventMap.put("strVideo", strVideo); // Store event in Firestore under the appropriate path String selectedSport = (String) spinnerSports.getSelectedItem(); // Get the selected sport's name String selectedLeague = (String) spinnerLeagues.getSelectedItem(); // Get the selected league's name db.collection("events").document(selectedSport) .collection("leagues").document(selectedLeague) .collection("seasons").document(season) .collection("matchdays") .document(idEvent) // Use unique ID to avoid overwriting .set(eventMap) // Store the event data .addOnSuccessListener(aVoid -> Log.d(TAG, "Event saved successfully")) .addOnFailureListener(e -> Log.e(TAG, "Error saving event data", e)); } } catch (JSONException e) { Log.e(TAG, "JSON parsing error in fetchEvents: ", e); } }, error -> { Log.e(TAG, "Network error in fetchEvents: ", error); } ); Volley.newRequestQueue(this).add(jsonObjectRequest); } } [/code] Я меняю ключ API на «xxx» для защиты. Подробнее здесь: [url]https://stackoverflow.com/questions/79131719/firestore-collection-rearrange-and-api-adjustment[/url]