CloudKit -ckrecord.id可接受的记录名称



我已经写了一种将记录保存在自定义区域中的方法,并且似乎正按预期工作。但是,我不确定的一件事是CKRecord.ID recordName。现在,我只使用UUID字符串。是否有一种分配recordName的首选方法?当前的CloudKit示例非常稀缺,似乎CK文档的一部分已经过时了。谢谢。

func saveToCloud(record: String, recordType: String, recordTypeField: String, reference: CKRecord?, referenceType: String?) {
    let zoneID = CKRecordZone.ID(zoneName: Zone.test, ownerName: CKRecordZone.ID.default.ownerName)
    let recordID = CKRecord.ID(recordName: UUID().uuidString, zoneID: zoneID)
    let newRecord = CKRecord(recordType: recordType, recordID: recordID)
    if let reference = reference, let referenceType = referenceType {
        let newReference = CKRecord.Reference(record: reference, action: .none)
        newRecord[referenceType] = newReference
    }
    newRecord[recordTypeField] = record
    database.save(newRecord) { (_,error) in
        if let err = error as? CKError {
            print("ERROR =" , err.userInfo )
        }
    }
}

我同意UUID是理想的。示例:

let newId = CKRecord.ID(recordName: UUID().uuidString)

但是,重要的是不要尝试使用无效字符或零长度字符串创建一个。结果是致命错误!因此,当从不受信任的源加载它们时(例如从服务器输出解析),我会使用以下安全函数:

extension CKRecord.ID {     
    public static func fromUntrusted(_ string: String?) -> CKRecord.ID? {
        guard let string = string else { return nil }
        guard let _ = string.data(using: .ascii, allowLossyConversion: false) else { return nil }
        guard string.count > 0 && string.count < 255 else { return nil }
        return CKRecord.ID(recordName: string)
    }
}

用法:

if let recordId = CKRecord.ID.fromUntrusted(response) {
    // use value
}

从我的角度来看,它在ckrecord.id的文档中非常清晰:

记录ID对象由名称字符串和区域ID组成。名称字符串是ASCII字符串,长度不超过255个字符。对于自动创建的记录,ID名称字符串基于UUID,因此可以保证是唯一的。创建自己的记录ID对象时,只要每个名称在指定区域内都是唯一的,则可以自由使用对应用程序或用户具有更大含义的名称。例如,您可以使用名称名称的名称。

根据我的经验,最好是从记录键中生成记录名称,即从必须是唯一的字段组合。

这样,即使您错误地尝试添加相同的记录两次,也可以保证唯一性。

afaik,没有其他方法可以使某些字段组合在CloudKit中与众不同。

相关内容

最新更新