← Назад к вопросам

Приведи пример использования базы данных

1.6 Junior🔥 41 комментариев
#Хранение данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример использования базы данных в iOS-приложении

В iOS-приложениях базы данных используются для локального хранения структурированных данных, таких как пользовательские настройки, кэшированный контент или оффлайн-доступ к информации. Рассмотрим практический пример работы с Core Data — основным фреймворком Apple для управления объектными графами и сохранения данных.

Архитектура и настройка

Для начала создадим модель данных. Предположим, мы разрабатываем приложение для учета задач (To-Do list). Создадим сущность Task с атрибутами:

  • id (UUID)
  • title (String)
  • isCompleted (Boolean)
  • createdAt (Date)

В Xcode добавляем файл DataModel.xcdatamodeld, определяем там сущность и атрибуты. Затем создаем managed object context — основной интерфейс для взаимодействия с базой данных.

import CoreData

class CoreDataManager {
    static let shared = CoreDataManager()
    
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Не удалось загрузить хранилище: \(error)")
            }
        }
        return container
    }()
    
    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    
    func saveContext() {
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                print("Ошибка сохранения: \(error)")
            }
        }
    }
}

CRUD-операции

CRUD (Create, Read, Update, Delete) — базовые операции для работы с данными.

1. Создание задачи

func createTask(title: String) -> Task {
    let task = Task(context: CoreDataManager.shared.context)
    task.id = UUID()
    task.title = title
    task.isCompleted = false
    task.createdAt = Date()
    
    CoreDataManager.shared.saveContext()
    return task
}

2. Чтение задач с фильтрацией

Используем NSFetchRequest для получения данных, например, всех незавершенных задач:

func fetchIncompleteTasks() -> [Task] {
    let request: NSFetchRequest<Task> = Task.fetchRequest()
    request.predicate = NSPredicate(format: "isCompleted == false")
    request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
    
    do {
        return try CoreDataManager.shared.context.fetch(request)
    } catch {
        print("Ошибка загрузки задач: \(error)")
        return []
    }
}

3. Обновление задачи

Например, отметка задачи как выполненной:

func completeTask(_ task: Task) {
    task.isCompleted = true
    CoreDataManager.shared.saveContext()
}

4. Удаление задачи

func deleteTask(_ task: Task) {
    CoreDataManager.shared.context.delete(task)
    CoreDataManager.shared.saveContext()
}

Интеграция с пользовательским интерфейсом

Для автоматического обновления UI при изменениях в базе данных используем NSFetchedResultsController. Он отслеживает изменения в Core Data и уведомляет делегата:

class TaskListViewController: UITableViewController, NSFetchedResultsControllerDelegate {
    var fetchedResultsController: NSFetchedResultsController<Task>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupFetchedResultsController()
    }
    
    private func setupFetchedResultsController() {
        let request: NSFetchRequest<Task> = Task.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
        
        fetchedResultsController = NSFetchedResultsController(
            fetchRequest: request,
            managedObjectContext: CoreDataManager.shared.context,
            sectionNameKeyPath: nil,
            cacheName: nil
        )
        fetchedResultsController.delegate = self
        
        do {
            try fetchedResultsController.performFetch()
        } catch {
            print("Ошибка выполнения запроса: \(error)")
        }
    }
    
    // NSFetchedResultsControllerDelegate методы для обновления таблицы
    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
        tableView.reloadData()
    }
}

Альтернативы и соображения

  • Realm: Часто используется как альтернатива Core Data, предлагает более простой API и лучшую производительность для некоторых сценариев
  • SQLite: Прямая работа через обертку вроде FMDB дает больше контроля, но требует написания SQL-запросов
  • UserDefaults: Подходит только для небольших простых данных (настройки, флаги)

Ключевые преимущества Core Data в этом примере:

  • Интеграция с iOS-экосистемой: автоматическая поддержка iCloud Sync, фоновых операций
  • Отслеживание изменений: NSFetchedResultsController упрощает синхронизацию UI с данными
  • Производительность: пакетное сохранение, faulting (ленивая загрузка объектов)
  • Безопасность: встроенная поддержка шифрования данных

Этот пример демонстрирует типичный паттерн использования базы данных в iOS-приложении — от создания модели до интеграции с интерфейсом, обеспечивая стабильное хранение данных и мгновенное обновление пользовательского интерфейса.

Приведи пример использования базы данных | PrepBro