Ma’lumotlarni saqlash (Core Data)


ULASHISH

Ma’lumotlarni saqlash (Core Data)

Ilova ma’lumotlarini NSPersistentContainer va SwiftUI integratsiyasidan foydalangan holda Core Data yordamida modellashtiring, saqlang va so‘rovlar orqali oling.


Core Data nima?

Core Data — Apple’ning obyektlar grafi va ma’lumotlarni saqlash freymvorki.

U modellar, bog‘lanishlar (relationships) va o‘zgarishlarni kuzatishni boshqaradi hamda ichki tomondan ma’lumotlarni SQLite’ga saqlashi mumkin.


Asosiy sozlash

Loyihani yaratishda Core Data’ni qo‘shing yoki NSPersistentContainer ni qo‘lda yarating va uning viewContext xususiyatini .environment(\_.managedObjectContext) orqali SwiftUI view’laringizga uzating.

Ushbu misolda bitta entity va ro‘yxat view’iga ega asosiy sozlash ko‘rsatilgan.

Sintaksis:

  • let container = NSPersistentContainer(name: "Model")
  • container.loadPersistentStores

Misol

import SwiftUI
import CoreData

@objc(Note)
class Note: NSManagedObject {
  @NSManaged var title: String?
}

extension Note {
  @nonobjc class func fetchRequest() -> NSFetchRequest<Note> { NSFetchRequest<Note>(entityName: "Note") }
}

struct PersistenceController {
  static let shared = PersistenceController()
  let container: NSPersistentContainer
  init() {
    // Programmatic model so the sample runs without an .xcdatamodeld
    let model = NSManagedObjectModel()
    let entity = NSEntityDescription()
    entity.name = "Note"
    entity.managedObjectClassName = NSStringFromClass(Note.self)
    let title = NSAttributeDescription()
    title.name = "title"
    title.attributeType = .stringAttributeType
    title.isOptional = true
    entity.properties = [title]
    model.entities = [entity]

    container = NSPersistentContainer(name: "MyModel", managedObjectModel: model)
    let description = NSPersistentStoreDescription()
    description.type = NSInMemoryStoreType
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores { _, error in
      if let error = error { fatalError("Unresolved error: \(error)") }
    }
  }
}

struct BasicCoreDataView: View {
  @Environment(\.managedObjectContext) private var context
  @FetchRequest(sortDescriptors: []) private var items: FetchedResults<Note>

  var body: some View {
    List(items, id: \.objectID) { note in Text(note.title ?? "") }
      .toolbar { Button("Add") { add() } }
  }

  private func add() {
    let i = Note(context: context)
    i.title = "New"
    try? context.save()
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View { BasicCoreDataView() }
}
import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\.managedObjectContext, persistence.container.viewContext)
    }
  }
}

Misolni ishga tushirish »

Ushbu misol persistent konteynerni initsializatsiya qiladi va elementlarni ro‘yxatlash hamda qo‘shish uchun @Environment(\.managedObjectContext) ni @FetchRequest bilan birga ishlatadi.

.xcdatamodeld haqidagi eslatma buni Xcode’da ishga tushirish uchun. U ushbu misolga taalluqli emas. Lekin Xcode’dan foydalanmoqchi bo‘lsangiz, loyihangizga .xcdatamodeld faylini qo‘shishingiz mumkin.



Namunaviy ilova: Notes (Core Data)

Ushbu misolda bir nechta entity va bog‘lanishlarga ega murakkabroq sozlash ko‘rsatilgan.

Sintaksis:

  • kontekst uchun @Environment(\.managedObjectContext)
  • so‘rov uchun @FetchRequest(sortDescriptors: [NSSortDescriptor(...)])
  • saqlash uchun context.save()

Misol

import SwiftUI
import CoreData

class NoteEntity: NSManagedObject {
  @NSManaged public var id: UUID?
  @NSManaged public var title: String?
  @NSManaged public var body: String?
}

extension NoteEntity: Identifiable {}

struct PersistenceController {
  static let shared = PersistenceController()
  let container: NSPersistentContainer
  init() {
    container = NSPersistentContainer(name: "MyModel")
    container.loadPersistentStores { _, error in
      if let error = error { fatalError("Unresolved error: \(error)") }
    }
  }
}

struct NotesCoreDataView: View {
  @Environment(\.managedObjectContext) private var context
  @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \NoteEntity.title, ascending: true)])
  private var notes: FetchedResults<NoteEntity>

  var body: some View {
    List(notes) { n in
      VStack(alignment: .leading) {
        Text(n.title ?? "Untitled").font(.headline)
        Text(n.body ?? "").font(.subheadline)
      }
    }
    .toolbar { Button("Add") { add() } }
  }

  private func add() {
    let n = NoteEntity(context: context)
    n.id = UUID(); n.title = "New Note"; n.body = ""
    try? context.save()
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View { NotesCoreDataView() }
}
import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\.managedObjectContext, persistence.container.viewContext)
    }
  }
}

Misolni ishga tushirish »


App Group umumiy ombori (vidjetdan kirish)

Vidjetingiz xuddi shu ma’lumotlarni o‘qiy olishi uchun Core Data SQLite faylingizni App Group ichida saqlang.

Ushbu misolda App Group umumiy omborini qanday sozlash ko‘rsatilgan.

Misol

import SwiftUI
import CoreData

struct PersistenceController {
  static let shared = PersistenceController()
  let container: NSPersistentContainer
  init() {
    container = NSPersistentContainer(name: "MyModel")
    if let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.notes") {
      let storeURL = groupURL.appendingPathComponent("MyModel.sqlite")
      let description = NSPersistentStoreDescription(url: storeURL)
      container.persistentStoreDescriptions = [description]
    }
    container.loadPersistentStores { _, error in
      if let error = error { fatalError("Unresolved error: \(error)") }
    }
  }
}

struct AppGroupListView: View {
  @Environment(\.managedObjectContext) private var context
  @FetchRequest(sortDescriptors: []) private var items: FetchedResults<Item>

  var body: some View {
    List(items) { item in Text(item.title ?? "") }
      .toolbar { Button("Add") { add() } }
  }

  private func add() {
    let i = Item(context: context)
    i.title = "Shared Item"
    try? context.save()
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View { AppGroupListView() }
}
import SwiftUI
import CoreData

@main
struct MyApp: App {
  let persistence = PersistenceController.shared
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environment(\(.managedObjectContext), persistence.container.viewContext)
    }
  }
}

Misolni ishga tushirish »

Widget target’ida ham xuddi shu App Group’ni yoqing, so‘ng xuddi shu konteyner URL’iga yo‘naltirilgan Core Data stack’i orqali so‘rov yuboring.

Maslahat: Og‘ir ishlarni asosiy viewContext da bajarmang.

Import va sinxronlash uchun fon kontekstlaridan (background contexts) foydalaning.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!