GLM 4.5 Air

Доступ к нестандартной базе данных Firestore в Swift

Полное руководство по извлечению документов из нестандартных баз данных Firestore в Swift. Узнайте, как правильно инициализировать и настраивать подключения к вторичным базам данных, таким как 'Staging', в проектах Firebase.

Вопрос

Как извлекать документы из вторичной базы данных Firestore в том же проекте Firebase?

Я работаю с проектом Firebase, в котором есть две базы данных: основная база данных и вторичная база данных под названием ‘Staging’. Когда я пытаюсь извлечь документы из базы данных ‘Staging’ с помощью следующего кода, он возвращает пустые результаты, несмотря на то, что в базе данных есть данные:

swift
let db = Firestore.firestore()
let documents = try await db.collection("stagingData").getDocuments().documents

Согласно документации Firebase, при неуказании базы данных по умолчанию используется ‘основная’ база данных. Как явно указать, что я хочу извлекать документы из базы данных ‘Staging’ вместо этого?

GLM 4.5 Air

Чтобы получать документы из нестандартной базы данных Firestore, такой как ‘Staging’, в Swift, необходимо использовать метод fire() с настраиваемой конфигурацией клиента. По умолчанию Firestore.firestore() всегда подключается к стандартной базе данных, поэтому при инициализации Firestore необходимо явно указать имя базы данных.

Содержание

Понимание конфигурации базы данных Firestore

Firestore позволяет использовать несколько баз данных в одном проекте Firebase, что полезно для разделения сред разработки, тестирования и производства. Каждая база данных работает независимо со своими собственными правилами безопасности, индексами и данными.

При инициализации Firestore с помощью Firestore.firestore() происходит автоматическое подключение к стандартной базе данных. Для подключения к другой базе данных необходимо указать ее имя во время инициализации.

Ключевой момент заключается в том, что Firestore не предоставляет прямого метода для переключения между базами данных после инициализации. Вместо этого необходимо создать новый экземпляр Firestore, настроенный для доступа к конкретной базе данных.

Доступ к нестандартным базам данных в Swift

Для подключения к нестандартной базе данных с именем ‘Staging’ необходимо использовать инициализатор Firestore.firestore(options:) с пользовательскими параметрами:

swift
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:

swift
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:

swift
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 или новее, существует еще более простой подход:

swift
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
}

Устранение распространенных проблем

  1. Пустые результаты: Если вы получаете пустые результаты, хотя в базе данных есть данные, проверьте:

    • Используете ли вы правильное имя базы данных
    • Может ли ваша сеть достичь конечной точки тестовой базы данных
    • Имеете ли вы соответствующие разрешения на чтение в соответствии с правилами безопасности базы данных
  2. Ошибки отказа в доступе: При работе с нестандартными базами данных убедитесь, что правила безопасности для этой базы данных разрешают выполняемые вами операции:

    swift
    // Проверьте правила безопасности для вашей тестовой базы данных
    // Они должны разрешать чтение из вашего приложения
    
  3. Проблемы с форматом URL: Дважды проверьте формат URL вашей базы данных. Для проектов Firebase URL нестандартных баз данных обычно следуют этому шаблону:

    {PROJECT_ID}-{DATABASE_ID}-{REGION}.firestore.{REGION}.googlecloud.com
    
  4. Порядок инициализации: Убедитесь, что Firebase инициализирован перед попыткой доступа к Firestore:

    swift
    FirebaseApp.configure()
    

Лучшие практики для работы с несколькими базами данных

  1. Именование баз данных: Используйте описательные имена для ваших баз данных (например, “Production”, “Staging”, “Development”), чтобы сделать ваш код более читаемым.

  2. Переменные окружения: Храните конфигурации баз данных в переменных окружения вместо жесткого кодирования:

    swift
    let stagingDBHost = ProcessInfo.processInfo.environment["FIREBASE_STAGING_HOST"] ?? ""
    
  3. Менеджер базы данных: Рассмотрите возможность создания класса менеджера базы данных для обработки разных подключений к базам данных:

    swift
    class 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)
        }
    }
    
  4. Чистое управление ресурсами: При работе с несколькими базами данных обеспечьте правильную очистку для утечек ресурсов:

    swift
    // Очистка при завершении работы
    Firestore.firestore(app: app).terminate()
    
  5. Обработка ошибок: Реализуйте надежную обработку ошибок для операций с базами данных, особенно при переключении между ними:

    swift
    do {
        let documents = try await stagingDB.collection("stagingData").getDocuments()
        return documents
    } catch let error as NSError {
        print("Ошибка при получении данных из тестовой базы данных: \(error.localizedDescription)")
        throw error
    }
    

Заключение

Чтобы получать документы из нестандартной базы данных Firestore в Swift, необходимо создать экземпляр Firestore с пользовательскими настройками, указывающими URL базы данных. Ключевые шаги включают:

  1. Получение экземпляра приложения Firebase
  2. Создание настроек Firestore с правильным URL-адресом для вашей нестандартной базы данных
  3. Инициализация нового экземпляра Firestore с этими настройками
  4. Использование этого экземпляра для выполнения операций с базой данных

Не забудьте заменить значения-заглушки, такие как YOUR_PROJECT_ID и REGION, на ваши фактические данные проекта. Следование этим практикам позволит вам бесшовно работать с несколькими базами данных Firestore в рамках одного проекта Firebase.