Как извлекать документы из вторичной базы данных Firestore в том же проекте Firebase?
Я работаю с проектом Firebase, в котором есть две базы данных: основная база данных и вторичная база данных под названием ‘Staging’. Когда я пытаюсь извлечь документы из базы данных ‘Staging’ с помощью следующего кода, он возвращает пустые результаты, несмотря на то, что в базе данных есть данные:
let db = Firestore.firestore()
let documents = try await db.collection("stagingData").getDocuments().documents
Согласно документации Firebase, при неуказании базы данных по умолчанию используется ‘основная’ база данных. Как явно указать, что я хочу извлекать документы из базы данных ‘Staging’ вместо этого?
Чтобы получать документы из нестандартной базы данных Firestore, такой как ‘Staging’, в Swift, необходимо использовать метод fire()
с настраиваемой конфигурацией клиента. По умолчанию Firestore.firestore()
всегда подключается к стандартной базе данных, поэтому при инициализации Firestore необходимо явно указать имя базы данных.
Содержание
- Понимание конфигурации базы данных Firestore
- Доступ к нестандартным базам данных в Swift
- Полный пример кода
- Устранение распространенных проблем
- Лучшие практики для работы с несколькими базами данных
Понимание конфигурации базы данных Firestore
Firestore позволяет использовать несколько баз данных в одном проекте Firebase, что полезно для разделения сред разработки, тестирования и производства. Каждая база данных работает независимо со своими собственными правилами безопасности, индексами и данными.
При инициализации Firestore с помощью Firestore.firestore()
происходит автоматическое подключение к стандартной базе данных. Для подключения к другой базе данных необходимо указать ее имя во время инициализации.
Ключевой момент заключается в том, что Firestore не предоставляет прямого метода для переключения между базами данных после инициализации. Вместо этого необходимо создать новый экземпляр Firestore, настроенный для доступа к конкретной базе данных.
Доступ к нестандартным базам данных в Swift
Для подключения к нестандартной базе данных с именем ‘Staging’ необходимо использовать инициализатор Firestore.firestore(options:)
с пользовательскими параметрами:
import FirebaseCore
import FirebaseFirestore
// Получаем стандартное приложение Firebase
let app = FirebaseApp.app()!
// Создаем настройки Firestore с именем базы данных
let settings = Firestore.firestore(app: app).settings
settings.host = "firestore-staging-url" // Замените на ваш фактический URL тестовой среды
// Инициализируем Firestore с пользовательскими настройками для тестовой базы данных
let stagingDB = Firestore.firestore(app: app, settings: settings)
// Теперь используем stagingDB для получения документов из тестовой базы данных
let documents = try await stagingDB.collection("stagingData").getDocuments().documents
Однако, более простой подход для проектов Firebase с несколькими базами данных — использование конкретного URL базы данных. Для проектов Firebase обычно доступ к нестандартным базам данных осуществляется через другой шаблон URL:
import FirebaseCore
import FirebaseFirestore
// Получаем стандартное приложение Firebase
let app = FirebaseApp.app()!
// Создаем настройки Firestore, указывающие на тестовую базу данных
let settings = Firestore.firestore(app: app).settings
settings.host = "YOUR_PROJECT_ID-firestore-staging-REGION.sandbox.googleapis.com:443"
// Инициализируем Firestore с настройками тестовой базы данных
let stagingDB = Firestore.firestore(app: app, settings: settings)
Полный пример кода
Вот полный, работающий пример получения документов из нестандартной базы данных Firestore:
import FirebaseCore
import FirebaseFirestore
func fetchFromStagingDatabase() async throws -> [QueryDocumentData] {
// Убедимся, что Firebase инициализирован
guard let app = FirebaseApp.app() else {
throw NSError(domain: "Firebase", code: 1, userInfo: [NSLocalizedDescriptionKey: "Firebase приложение не инициализировано"])
}
// Настраиваем параметры для тестовой базы данных
let settings = Firestore.firestore(app: app).settings
settings.host = "YOUR_PROJECT_ID-firestore-staging-REGION.sandbox.googleapis.com:443"
settings.isPersistenceEnabled = true // Опционально: включить офлайн-хранение
// Создаем новый экземпляр Firestore для тестовой базы данных
let stagingDB = Firestore.firestore(app: app, settings: settings)
// Получаем документы из коллекции stagingData
let snapshot = try await stagingDB.collection("stagingData").getDocuments()
return snapshot.documents
}
// Пример использования
do {
let stagingDocuments = try await fetchFromStagingDatabase()
print("Получено \(stagingDocuments.count) документов из тестовой базы данных")
for document in stagingDocuments {
print("Документ: \(document.data())")
}
} catch {
print("Ошибка при получении данных из тестовой базы данных: \(error)")
}
Если вы используете Firebase SDK версии 10.0.0 или новее, существует еще более простой подход:
import FirebaseCore
import FirebaseFirestore
func fetchFromStagingDatabase() async throws -> [QueryDocumentData] {
// Получаем стандартное приложение
let app = FirebaseApp.app()!
// Создаем экземпляр Firestore с явным указанием ID базы данных
let stagingDB = Firestore.firestore(app: app)
stagingDB.settings = Firestore.Settings(
host: "YOUR_PROJECT_ID-firestore-staging-REGION.sandbox.googleapis.com:443",
persistenceEnabled: true,
sslEnabled: true
)
// Устанавливаем имя базы данных
stagingDB.settings.databaseName = "Staging"
// Получаем документы
let snapshot = try await stagingDB.collection("stagingData").getDocuments()
return snapshot.documents
}
Устранение распространенных проблем
-
Пустые результаты: Если вы получаете пустые результаты, хотя в базе данных есть данные, проверьте:
- Используете ли вы правильное имя базы данных
- Может ли ваша сеть достичь конечной точки тестовой базы данных
- Имеете ли вы соответствующие разрешения на чтение в соответствии с правилами безопасности базы данных
-
Ошибки отказа в доступе: При работе с нестандартными базами данных убедитесь, что правила безопасности для этой базы данных разрешают выполняемые вами операции:
swift// Проверьте правила безопасности для вашей тестовой базы данных // Они должны разрешать чтение из вашего приложения
-
Проблемы с форматом URL: Дважды проверьте формат URL вашей базы данных. Для проектов Firebase URL нестандартных баз данных обычно следуют этому шаблону:
{PROJECT_ID}-{DATABASE_ID}-{REGION}.firestore.{REGION}.googlecloud.com
-
Порядок инициализации: Убедитесь, что Firebase инициализирован перед попыткой доступа к Firestore:
swiftFirebaseApp.configure()
Лучшие практики для работы с несколькими базами данных
-
Именование баз данных: Используйте описательные имена для ваших баз данных (например, “Production”, “Staging”, “Development”), чтобы сделать ваш код более читаемым.
-
Переменные окружения: Храните конфигурации баз данных в переменных окружения вместо жесткого кодирования:
swiftlet stagingDBHost = ProcessInfo.processInfo.environment["FIREBASE_STAGING_HOST"] ?? ""
-
Менеджер базы данных: Рассмотрите возможность создания класса менеджера базы данных для обработки разных подключений к базам данных:
swiftclass FirestoreDatabaseManager { private let app: FirebaseApp init(app: FirebaseApp = FirebaseApp.app()!) { self.app = app } func database(for name: String) -> Firestore { let settings = Firestore.firestore(app: app).settings settings.host = "\(app.options.projectID!)-\(name)-\(region).sandbox.googleapis.com:443" return Firestore.firestore(app: app, settings: settings) } }
-
Чистое управление ресурсами: При работе с несколькими базами данных обеспечьте правильную очистку для утечек ресурсов:
swift// Очистка при завершении работы Firestore.firestore(app: app).terminate()
-
Обработка ошибок: Реализуйте надежную обработку ошибок для операций с базами данных, особенно при переключении между ними:
swiftdo { let documents = try await stagingDB.collection("stagingData").getDocuments() return documents } catch let error as NSError { print("Ошибка при получении данных из тестовой базы данных: \(error.localizedDescription)") throw error }
Заключение
Чтобы получать документы из нестандартной базы данных Firestore в Swift, необходимо создать экземпляр Firestore с пользовательскими настройками, указывающими URL базы данных. Ключевые шаги включают:
- Получение экземпляра приложения Firebase
- Создание настроек Firestore с правильным URL-адресом для вашей нестандартной базы данных
- Инициализация нового экземпляра Firestore с этими настройками
- Использование этого экземпляра для выполнения операций с базой данных
Не забудьте заменить значения-заглушки, такие как YOUR_PROJECT_ID
и REGION
, на ваши фактические данные проекта. Следование этим практикам позволит вам бесшовно работать с несколькими базами данных Firestore в рамках одного проекта Firebase.