Published on

SwiftData ni so'rash va ko'rsatish

Authors

Yozuvni SwiftData ga qo'shish faqat yarmini bajarish. Endi siz ularni o'qib UI da ko'rsatishingiz kerak. Buning uchun @Query makrosi ishlatiladi β€” u ma'lumot bazasidan model ob'ektlarni olib, ma'lumot o'zgarganda ko'rinishni jonli ushlab turadi.

@Query ning go'zalligi β€” qo'shimcha kod shart emas. Xususiyatni e'lon qilasiz va SwiftData uni to'ldiradi. Yangi yozuv qo'shilsa, o'chirilsa yoki yangilansa @Query o'zgarishni ushlab oladi va SwiftUI ko'rinishni qayta render qiladi.

To'liq vazifalar boshqaruvchi ko'rinish

import SwiftData
import SwiftUI

struct VazifaRo'yxatiKorinishi: View {
    // @Query barcha VazifaElement larni ma'lumot bazasidan oladi
    @Query var vazifalar: [VazifaElement]

    // modelContext qo'shish va o'chirish imkonini beradi
    @Environment(\.modelContext) private var modelContext

    var body: some View {
        NavigationStack {
            List {
                // ForEach @Query tomonidan qaytarilgan har bir VazifaElement ni aylanib chiqadi
                ForEach(vazifalar) { vazifa in
                    HStack {
                        // Bajarilgan bo'lsa belgi ko'rinishi
                        Image(systemName: vazifa.bajarildi ? "checkmark.circle.fill" : "circle")
                            .foregroundStyle(vazifa.bajarildi ? .green : .gray)
                            .onTapGesture {
                                // Xususiyatni to'g'ridan-to'g'ri o'zgartirish β€” SwiftData avtomatik saqlaydi
                                vazifa.bajarildi.toggle()
                            }
                        Text(vazifa.sarlavha)
                    }
                }
                // .onDelete foydalanuvchi chapga sirtmoqlaganda ishlatiladi
                .onDelete(perform: vazifaOchirish)
            }
            .navigationTitle("Vazifalar")
            .toolbar {
                Button("Qo'shish", systemImage: "plus") {
                    // Yangi VazifaElement yaratib ma'lumot bazasiga qo'shish
                    let vazifa = VazifaElement(sarlavha: "Yangi vazifa")
                    modelContext.insert(vazifa)
                }
            }
        }
    }

    // .onDelete tomonidan o'chiriladigan qatorlar IndexSet bilan chaqiriladi
    func vazifaOchirish(offsets: IndexSet) {
        for index in offsets {
            modelContext.delete(vazifalar[index])
        }
    }
}
QatorVazifasi
@Query var vazifalar: [VazifaElement]Ma'lumot bazasidan barcha VazifaElement larni oladi va ko'rinishni o'zgarishlar bilan jonli ushlab turadi. Qo'shimcha yangilash kodi shart emas.
ForEach(vazifalar) { vazifa in }@Query tomonidan qaytarilgan har bir element bo'yicha aylanadi.
vazifa.bajarildi.toggle()Xususiyatni to'g'ridan-to'g'ri mutatsiya qiladi. SwiftData @Model xususiyatlaridagi o'zgarishlarni avtomatik kuzatadi va saqlaydi.
.onDelete(perform: vazifaOchirish)Chapga sirtmoqlash bilan o'chirish imkonini beradi. IndexSet o'chirilayotgan qatorlarni bildiradi.
modelContext.delete(vazifalar[index])Yozuvni ma'lumot bazasidan o'chiradi.

Saralash va filtrlash

// Yaratilgan vaqt bo'yicha saralash β€” eng eski birinchi
@Query(sort: \VazifaElement.yaratilganVaqt)
var vazifalar: [VazifaElement]

// Teskari tartib β€” eng yangi birinchi
@Query(sort: \VazifaElement.yaratilganVaqt, order: .reverse)
var vazifalar: [VazifaElement]

// Filtrlash β€” faqat bajarilmagan vazifalar
@Query(filter: #Predicate<VazifaElement> { $0.bajarildi == false })
var bajarilmaganVazifalar: [VazifaElement]

// Filtrlash va saralash birgalikda
@Query(
    filter: #Predicate<VazifaElement> { $0.bajarildi == false },
    sort: \VazifaElement.yaratilganVaqt,
    order: .reverse
)
var bajarilmaganVazifalar: [VazifaElement]

Preview uchun namuna ma'lumot

#Preview {
    // inMemory: true β€” preview ma'lumoti diskka yozilmaydi
    let konfiguratsiya = ModelConfiguration(isStoredInMemoryOnly: true)
    let konteyner = try! ModelContainer(for: VazifaElement.self,
                                        configurations: konfiguratsiya)

    // Preview uchun namuna ma'lumot qo'shish
    let namunalar = ["Non sotib ol", "Kod yoz", "Yugur"]
    for sarlavha in namunalar {
        konteyner.mainContext.insert(VazifaElement(sarlavha: sarlavha))
    }

    return VazifaRo'yxatiKorinishi()
        .modelContainer(konteyner)
}

Tezkor ma'lumotnoma

SintaksisVazifasi
@Query var elements: [ModelTuri]Barcha yozuvlarni oladi, o'zgarishlarda jonli yangilanadi
@Query(sort: \Model.xususiyat)Xususiyat bo'yicha o'sish tartibida saralaydi
@Query(sort: \Model.xususiyat, order: .reverse)Kamayish tartibida saralaydi
@Query(filter: #Predicate<Model> { ... })Shartga mos yozuvlarni filtrlaydi
model.xususiyat = yangiQiymatTo'g'ridan-to'g'ri mutatsiya β€” SwiftData avtomatik saqlaydi
.onDelete(perform: funksiya)Chapga sirtmoqlash bilan o'chirish
modelContext.delete(model)Yozuvni ma'lumot bazasidan o'chiradi

🎯 Topshiriq: to'liq vazifalar ilovasi

9.4 darsdan loyihangizga @Query bilan VazifaRo'yxatiKorinishi qo'shing. Qo'shish va o'chirish ishlashini tasdiqlang. Keyin: yaratilgan vaqt bo'yicha teskari tartibda saralang (eng yangi tepada). Faqat bajarilmaganlarni ko'rsatadigan va barchasini ko'rsatadigan ikki @Query qo'shing β€” Picker bilan orasida almashing. Simulyatorda ilovani yoping, qayta oching va ma'lumot saqlanganini tasdiqlang.

Buy mea coffee