- Published on
CloudKit 2: Ma'lumotlarni qo'shish, o'qish, o'zgartirish va o'chirish (CRUD)
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
CRUD nima?
Dasturlashda ma'lumotlar bazasi bilan ishlashning 4 ta asosiy amali bor va ularni qisqacha CRUD deb atashadi:
- Create (Yaratish/Qo'shish)
- Read (O'qish/Yuklab olish)
- Update (O'zgartirish)
- Delete (O'chirish)
Ushbu darsda biz mevalar ro'yxati (Fruits) misolida CloudKit'ning ommaviy xotirasida (Public Database) shu amallarni bajaramiz.
1. Create (Ma'lumot yaratish)
CloudKit'ga har qanday ma'lumotni yuklashdan oldin uni maxsus CKRecord formatiga o'girish kerak. CKRecord huddi Swift'dagi Dictionary ga o'xshaydi (kalit-qiymat).
import CloudKit
func addFruit(name: String) {
// 1. Yangi record yaratish. Turi: "Fruits"
let newFruit = CKRecord(recordType: "Fruits")
// 2. Unga qiymat berish (kalit: "name")
newFruit["name"] = name
// 3. Ommaviy bazaga saqlash
saveItem(record: newFruit)
}
func saveItem(record: CKRecord) {
CKContainer.default().publicCloudDatabase.save(record) { returnedRecord, returnedError in
if let error = returnedError {
print("Saqlashda xatolik: \(error.localizedDescription)")
} else {
print("Muvaffaqiyatli saqlandi!")
}
}
}
Eslatma: CloudKit konsolida (brauzerda) "Fruits" degan turni o'zingiz oldindan yaratishingiz shart emas. Kod ishga tushganda uning o'zi bazada shu turni va uning ichidagi "name" ustunini avtomatik yaratib oladi.
2. Read (Ma'lumotlarni o'qish)
O'qish bir oz murakkabroq, sababi bizga CloudKit'ga "Menga barcha Fruits ni ber" deb buyruq berish (Operation) kerak bo'ladi. Bu ishni CKQueryOperation orqali qilamiz.
func fetchItems() {
// Barcha mevalarni so'rash uchun shart (predicate: true - hammasi degani)
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Fruits", predicate: predicate)
let queryOperation = CKQueryOperation(query: query)
var returnedFruits: [String] = []
// Har bir meva yuklanganda ishga tushadi
queryOperation.recordMatchedBlock = { recordID, result in
switch result {
case .success(let record):
if let name = record["name"] as? String {
returnedFruits.append(name)
}
case .failure(let error):
print("Xatolik: \(error)")
}
}
// Barcha so'rovlar yakunlanganda ishga tushadi
queryOperation.queryResultBlock = { [weak self] result in
DispatchQueue.main.async {
self?.fruits = returnedFruits
}
}
// Operatsiyani bazaga jo'natish
CKContainer.default().publicCloudDatabase.add(queryOperation)
}
Eslatma: CloudKit'da yangi qatorni o'qish imkoniyati ochilishi uchun, Console'dan (Dashboard'dan) RecordName indeksini "Queryable" qilib belgilashni unutmang. Aks holda queryResultBlock xatolik qaytaradi.
3. Update (Ma'lumotni o'zgartirish)
Tahrirlash jarayoni shunchaki ma'lumotni o'zgartirib, yana bazaga save() qilishga o'xshaydi.
func updateFruit(fruit: CKRecord, newName: String) {
fruit["name"] = newName
CKContainer.default().publicCloudDatabase.save(fruit) { returnedRecord, error in
// Yangilangan record qaytadi
}
}
4. Delete (Ma'lumotni o'chirish)
O'chirish uchun faqatgina o'sha record'ning unikal ID si (recordID) kerak bo'ladi.
func deleteFruit(indexSet: IndexSet) {
guard let index = indexSet.first else { return }
let fruitRecord = fruitsList[index]
CKContainer.default().publicCloudDatabase.delete(withRecordID: fruitRecord.recordID) { returnedRecordID, error in
if error == nil {
print("Muvaffaqiyatli o'chirildi!")
}
}
}
Shu 4 ta amal bilan siz endi Apple'ning xavfsiz va tekin (muayyan doirada) CloudKit bazasidan ishonchli foydalanib, foydalanuvchilar orasida ma'lumot almashinadigan murakkab ilovalar yoza olasiz!