Ma’lumotlarni saqlash (Core Data)
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)
}
}
}
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)
}
}
}
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)
}
}
}
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!
