- Published on
SwiftData ni so'rash va ko'rsatish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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])
}
}
}
| Qator | Vazifasi |
|---|---|
@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
| Sintaksis | Vazifasi |
|---|---|
@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 = yangiQiymat | To'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.