Core Data / SwiftData
Darsliklar (Tutorials)
Core Data / SwiftData — To'liq Darslik
Mundarija
- Nega lokal ma'lumotlar bazasi kerak?
- Core Data asoslari
- Entity va Attributes yaratish
- CRUD operatsiyalari
- NSFetchRequest va Predicate
- Relationships (Bog'lanishlar)
- Lightweight Migration
- Background Thread'da ishlash
- SwiftData (iOS 17+)
- Core Data vs SwiftData vs Realm
- Real loyiha: Notes App
- Xulosa
1. Nega lokal ma'lumotlar bazasi kerak? {#motivatsiya}
Ilova har doim ham internetga muhtoj bo'lmasligi kerak.
- Offline rejim: Samolyotda yoki internet yomon joyda ilovangiz ishlashi uchun.
- Tezlik: Ma'lumotni qurilmani o'zidan o'qish serverdan ko'ra ming marta tezroq.
- UserDefaults cheklovi:
UserDefaultskichik sozlamalar (settinglar) uchun, katta ma'lumotlar uchun emas.
2. Core Data asoslari {#core-data-asoslari}
Core Data — bu shunchaki ma'lumotlar bazasi emas, bu Obyektlarni Boshqarish Framework'i.
- NSManagedObject: Bitta ma'lumot birligi (xuddi SQL dagi Row kabi).
- NSManagedObjectContext: Bizning "scratchpad" (mashq daftari). Barcha o'zgarishlar shuyerda qilinadi va
save()orqali bazaga yoziladi. - NSPersistentContainer: Core Data stekini (stack) o'zida ushlab turuvchi asosiy konteyner.
3. Entity va Attributes yaratish {#entity-yaratish}
Xcode ichidagi .xcdatamodeld fayli orqali biz modellarni chizamiz.
- Entity: Klass nomi (masalan,
Note). - Attributes: Variable nomlari (masalan,
title: String,content: String,date: Date).
4. CRUD operatsiyalari {#crud-operatsiyalari}
Create (Yaratish):
let context = container.viewContext
let newNote = Note(context: context)
newNote.title = "Dars"
newNote.date = Date()
try? context.save() // Bazaga saqlash
Read (O'qish):
let request: NSFetchRequest<Note> = Note.fetchRequest()
let notes = try? context.fetch(request)
5. NSFetchRequest va Predicate {#fetch-request}
Faqat kerakli ma'lumotlarni filtrlash uchun NSPredicate ishlatiladi.
let request: NSFetchRequest<Note> = Note.fetchRequest()
// Faqat "iOS" so'zi bor sarlavhalarni olish
request.predicate = NSPredicate(format: "title CONTAINS[cd] %@", "iOS")
// Bo'yicha tartiblash (sort)
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
6. Relationships (Bog'lanishlar) {#relationships}
Obyektlar bir-biri bilan bog'lanishi mumkin.
- One-to-One: Masalan, bitta foydalanuvchi — bitta profil.
- One-to-Many: Masalan, bitta kategoriya — ko'plab postlar.
7. Lightweight Migration {#migration}
Agar siz Entity'ga yangi field qo'shsangiz, ilova crash bo'ladi. Buning oldini olish uchun "Migration" kerak. Xcode buni avtomatik (lightweight) qila oladi, agar o'zgarishlar oddiy bo'lsa.
8. Background Thread'da ishlash {#background-thread}
Katta hajmdagi ma'lumotlarni saqlash UI'ni qotirib qo'yishi mumkin. Shuning uchun privateContext ishlatiladi:
container.performBackgroundTask { context in
// Bu yerda og'ir ishlar bajariladi
try? context.save()
}
9. SwiftData (iOS 17+) {#swift-data}
SwiftData — Apple'ning Core Data dan keyingi yangi framework'i. U to'liq Swift va SwiftUI tili uchun moslashtirilgan.
@Model
class Note {
var title: String
var content: String
init(title: String, content: String) {
self.title = title
self.content = content
}
}
// SwiftUI da ishlatish
@Query var notes: [Note]
10. Core Data vs SwiftData vs Realm {#comparison}
| Xususiyat | Core Data | SwiftData | Realm |
|---|---|---|---|
| Platforma | Apple (Eski) | Apple (Yangi, iOS 17+) | Cross-platform |
| Osonlik | 🟠 O'rtacha | 🟢 Juda oson | 🟢 Oson |
| SwiftUI | 🟠 Muammoli | 🟢 Ideal | 🟢 Yaxshi |
11. Real loyiha: Notes App {#real-loyiha}
Darslikda biz to'liq "Eslatmalar" ilovasini quramiz. Foydalanuvchi yangi note qo'shishi, ularni qidirishi va o'chirishi mumkin bo'ladi.
12. Xulosa {#xulosa}
Lokal ma'lumotlar bazasi ilovani professional qiladi.
- Eskiroq loyihalar uchun Core Data'ni bilish shart.
- Yangi loyihalar uchun SwiftData'ga o'tish tavsiya etiladi.
Vazifa: Core Data bilan oddiy "Shopping List" ilovasini yaratib ko'ring! 🛒