# Core Data / SwiftData — To'liq Darslik

## Mundarija
1. [Nega lokal ma'lumotlar bazasi kerak?](#motivatsiya)
2. [Core Data asoslari](#core-data-asoslari)
3. [Entity va Attributes yaratish](#entity-yaratish)
4. [CRUD operatsiyalari](#crud-operatsiyalari)
5. [NSFetchRequest va Predicate](#fetch-request)
6. [Relationships (Bog'lanishlar)](#relationships)
7. [Lightweight Migration](#migration)
8. [Background Thread'da ishlash](#background-thread)
9. [SwiftData (iOS 17+)](#swift-data)
10. [Core Data vs SwiftData vs Realm](#comparison)
11. [Real loyiha: Notes App](#real-loyiha)
12. [Xulosa](#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:** `UserDefaults` kichik 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):**
```swift
let context = container.viewContext
let newNote = Note(context: context)
newNote.title = "Dars"
newNote.date = Date()

try? context.save() // Bazaga saqlash
```

**Read (O'qish):**
```swift
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.

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

```swift
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.

```swift
@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! 🛒
