CKDatabase的简单使用
let database = CKContainer.default().publicCloudDatabase //CKContainer: Containers 就像应用运行的沙盒一样,一个应用只能访问自己沙盒中的内容而不能访问其他应用的 override func viewDidLoad() { super.viewDidLoad() let volvo = CKRecord.init(recordType: "person1") volvo.setObject("liu" as __CKRecordObjCValue, forKey: "name") volvo.setObject(18 as __CKRecordObjCValue, forKey: "age") volvo.setObject(false as __CKRecordObjCValue, forKey: "isMan") database.save(volvo) { (record, error) in if error == nil{ print("成功 \(record?.object(forKey: "name"))") }else{ print("失败") } } }
Demo,创建区域记录
class ViewController: UIViewController{ let database = CKContainer.default().privateCloudDatabase enum CarType:String{ case Hatckback = "Hatckback" case Estate = "Estate" func zoneId()->CKRecordZone.ID{ // CKOwnerDefaultName let zoneID = CKRecordZone.ID.init(zoneName: self.rawValue, ownerName: CKRecordZone.ID.defaultZoneName) return zoneID } func zone() -> CKRecordZone{ return CKRecordZone.init(zoneID: self.zoneId()) } } //生成一个区域的记录 func carWithType(type:CarType)->CKRecord{ let uuid = NSUUID().uuidString//随机成功一个标识符,随便起名字,不需要使用uuid let recordId = CKRecord.ID.init(recordName: uuid, zoneID: type.zoneId())//生成区域的名字 let car = CKRecord.init(recordType: "MyCar", recordID: recordId)//MyCar想要一个名菜MyCar的模式 return car } //给记录赋值 func carWithType(type: CarType, maker: String, model: String, numberOfDoors: Int, year: Int) -> CKRecord{ let record = carWithType(type: type);//生成记录 record.setValue(maker, forKey: "maker");//给记录复制 record.setValue(model, forKey: "model"); record.setValue(numberOfDoors, forKey: "numberOfDoors"); record.setValue(year, forKey: "year"); return record } //返回一个区域的赋值记录 func hatchbackCarWithMaker(maker: String,model: String,numberOfDoors: Int, year: Int) -> CKRecord{ return carWithType(type: .Hatckback, maker: maker, model: model, numberOfDoors: numberOfDoors, year: year) } func estateCarWithMaker(maker: String, model: String, numberOfDoors: Int, year: Int) -> CKRecord{ return carWithType(type: .Estate, maker: maker, model: model, numberOfDoors: numberOfDoors, year: year) } // func saveCarClosure(record: CKRecord! , error: CKError! ){ /* 小心,可能在非UI线程中 */ if error != nil{ // error as! CKError print("Failed to save the car. Error = \(String(describing: error)) ::::\(String(describing: error.retryAfterSeconds))") }else{ print("Successfully saved the car with type \(record.recordType)") } } //保存多条记录 func saveCars(cars: [CKRecord]){ for car in cars{ database.save(car) {[weak self] (record, error) in self?.saveCarClosure(record: record, error: error as? CKError) } } } func saveEstateCars(){ let volvoV50 = estateCarWithMaker(maker: "Volvo", model: "V50", numberOfDoors: 5, year: 2016); let audiA6 = estateCarWithMaker(maker: "Audi", model: "A6", numberOfDoors: 5, year: 2018); let skodaOctavia = estateCarWithMaker(maker: "Skoda", model: "Octavia", numberOfDoors: 5, year: 2016); print("Saving estate cars...") saveCars(cars: [volvoV50, audiA6, skodaOctavia]) } func saveHatchbackCars(){ let fordFocus = hatchbackCarWithMaker(maker: "Formaker: d", model: "Focus", numberOfDoors: 6, year: 2018) print("Saving hatchback cars...") saveCars(cars: [fordFocus]) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //检查用户是否登录了iCloud账号 if isIcloudAvailable() == false{ print("iCloud is not available.") return } //使用fetchAllRecordZones插件用户私有数据库已经存在的数据,如果创建,则保存数据,如果为创建,则先创建区域 database.fetchAllRecordZones {[weak self] (zones , error) in if error != nil{ print("Could not retrieve the zones") }else { var foundEstateZone = false var foundHatchbackZone = false for zone in zones as! [CKRecordZone]{ if zone.zoneID.zoneName == CarType.Hatckback.rawValue{ foundHatchbackZone = true } else if zone.zoneID.zoneName == CarType.Estate.rawValue{ foundEstateZone = true } } self! .useOrSaveZone(zoneIsCreatedAlready: foundEstateZone, forCarType: .Estate) // self! .useOrSaveZone(zoneIsCreatedAlready: foundHatchbackZone, forCarType: .Hatckback) } } } //检查用户是否登录了iCloud账号 func isIcloudAvailable() -> Bool{ print(FileManager.default.ubiquityIdentityToken) if let token = FileManager.default.ubiquityIdentityToken{ return true } else { return false } } func saveCarsForType(type: CarType){ switch type{ case .Hatckback: saveHatchbackCars() case .Estate: saveEstateCars() default: print("Unknown car state is given") } } // zoneIsCreatedAlready区域是否存在 func useOrSaveZone(zoneIsCreatedAlready: Bool, forCarType: CarType){ if zoneIsCreatedAlready{ print("Found the \(forCarType.rawValue) ,z,o,n,e. It' s been created already") saveCarsForType(type: forCarType) } else { database.save(forCarType.zone()) {[weak self] (zone, error) in if error != nil{ print("Could not save the hatchback zone.\(String(describing: error)) ") }else{ print("Successfully saved the hatchback zon") self?.saveCarsForType(type: forCarType) // print("Successfully saved the hatchback zon") } } } } }