- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我遇到了一个非常奇怪的问题,我想我要么不了解 CloudKit 在后台是如何工作的,要么我在 CloudKit 中遇到了一个错误。
所以,问题看起来像这样:
应用初始状态:
我有 5 条“包裹”记录,我们称它们为 A、B、C、D、E。
用户操作
用户将删除“包”记录 E,并在稍后的某个时间点按下刷新按钮,该按钮将从云中获取所有当前的“包”记录。
问题
当用户按下刷新按钮时,应用程序基本上会查看现有的本地存储的“包”记录,并将创建一个带有谓词的 CKQuery,该谓词应该获取本地不存在的任何其他记录。下一步基本上是调用 [数据库 performQuery: inZoneWithID:completionHandler:] 方法。
当我得到结果时,惊喜出现了,其中包含用户先前删除的“包”记录 E。
这似乎不适合我...
我调试的步骤:
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *privateDB = [container privateCloudDatabase];
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName: @"DS2000330803AS"];
CKModifyRecordsOperation *operation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave: nil recordIDsToDelete: @[recordID]];
operation.database = privateDB;
[operation setModifyRecordsCompletionBlock:^(NSArray<CKRecord *> * _Nullable savedRecords,
NSArray<CKRecordID *> * _Nullable deletedRecordIDs,
NSError * _Nullable error) {
CKFetchRecordsOperation *fetchOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs:@[recordID]];
fetchOperation.database = privateDB;
[fetchOperation setPerRecordCompletionBlock:^(CKRecord * _Nullable record, CKRecordID * _Nullable recordID, NSError * _Nullable error){
NSLog(@"Error: %@", error.localizedDescription);
}];
}];
[NSTimer scheduledTimerWithTimeInterval:100 repeats:NO block:^(NSTimer * _Nonnull timer) {
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *privateDB = [container privateCloudDatabase];
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:@"DS2000330803AS"];
CKFetchRecordsOperation *fetchOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs: @[recordID]];
fetchOperation.database = privateDB;
[fetchOperation setPerRecordCompletionBlock:^(CKRecord * _Nullable record, CKRecordID * _Nullable recordID, NSError * _Nullable error){
NSLog(@"Error: %@", error.localizedDescription);
}];
[privateDB addOperation: fetchOperation];
}];
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *privateDB = [container privateCloudDatabase];
NSPredicate *predicate = [NSPredicate predicateWithValue: YES];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Package" predicate:predicate];
[privateDB performQuery:query
inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {
[results enumerateObjectsUsingBlock:^(CKRecord * _Nonnull record, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Record ID: %@", record.recordID);
CKFetchRecordsOperation *fetchOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs: @[record.recordID]];
fetchOperation.database = privateDB;
[fetchOperation setPerRecordCompletionBlock:^(CKRecord * _Nullable record, CKRecordID * _Nullable recordID, NSError * _Nullable error){
NSLog(@"Error: %@", error.localizedDescription);
}];
[privateDB addOperation: fetchOperation];
}];
}];
最佳答案
我认为您混淆了记录类型和记录名称(CKRecordID 的字符串)。名称由 CloudKit(通常)分配,类型由您设置。我敢打赌它是自动分配的,但我必须看看记录是如何保存的。看到您的 CloudKit 仪表板的屏幕截图会很有趣。
在你的代码块中
1)您正在尝试使用记录类型删除某些记录的记录名称。这就是您收到错误“找不到记录”的原因
2)与您仍在使用记录类型而不是记录名称相同
3) 获取记录,因为它实际上正在使用分配的 record.recordID。
这是我对这种情况的直觉。至于删除和刷新请看我的answer关于拼接记录以保持 UI 和数据库同步。
关于ios - 删除 CKRecord 真的很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088549/
我想像文档显示那样使用下标运算符:myRecord[@"firstName"] = @"Jacob"; 但无法让它在 Swift 中工作。 知道为什么吗? 最佳答案 在这篇文章中,您可以看到为什么订阅
我写了下面的代码来共享一个 CKRecord: CKRecordZone *restaurantsZone = [[CKRecordZone alloc] initWithZoneName:@"Res
在公共(public)数据库上查询: let pred = NSPredicate(format: "family == %@", ref) let query = CKQuery(recordTyp
假设我在私有(private) CloudKit 数据库中有 A 类型的记录。如何在不指定记录 ID 或查询谓词的情况下获取该类型的 ALL 记录? 最佳答案 CKQuery 在初始化时需要一个非 n
如何在客户端以编程方式从我的数据库中删除 CKRecord。 for record in records { if recordNumber 13 { // DELETE R
我无法保存已保存的记录。 recordToSave 是从服务器下载的 CKRecord。可以更新吗? recordTosave.setValue("cat", forKey: "animal") le
我正在尝试根据用户的用户名获取用户的值。我能够使用以下方法获得正确的用户: class func getByUsername(username: String, callback: (records:
我有几个可编码的结构,我想创建一个通用协议(protocol)来将它们编码为 CloudKit 的 CKRecord 并解码回来。 我有一个用于创建字典的 Encodable 扩展: extensio
所以我遇到了一个非常奇怪的问题,我想我要么不了解 CloudKit 在后台是如何工作的,要么我在 CloudKit 中遇到了一个错误。 所以,问题看起来像这样: 应用初始状态: 我有 5 条“包裹”记
我需要迁移记录,因为“CKFetchRecordChangesOperation”不适用于默认记录。我应该一个一个地迁移它还是有什么方法可以自动迁移? 最佳答案 是的,需要一项一项的完成。您需要从旧区
在我的应用程序中,我有数百个电影对象作为CKRecord,在检索它们后将其放入数组中。例如,我希望有一种方法来检查数组是否包含标题为“泰坦尼克号”的电影记录。 到目前为止我所做的就是像这样循环数组:
因此,我正在创建一个将大量重复使用某些记录的应用程序,因此我想出了一个想法: import CloudKit class Class: CKRecord { override init
我所做的就是: if let id = record.lastModifiedUserRecordID { publicDatabase.fetch(withRecordID: id) { r
我使用以下代码在自定义私有(private) CKRecordZone 中创建 CKRecord: let noteZoneID = CKRecordZone.ID(zoneName: CloudKi
有没有办法从CKRecord中删除对象/键?它在某种程度上就像一个 NSDictionary ,但我相信没有可用的方法来完成这项任务。与 NSDictionary 不同,我们有 - (void)rem
我有一个自定义类,我用它制作了一个 (swift-y) 结构 NSCodable。现在我想将其转换为 CKRecord 以便使用 CloudKit。尽管我在对我的结构进行编码时设置了“键值”对,但据我
我认为将包含信息的基本数据对象定义为 CKRecord 可能是个好主意,因为我显然会使用 CloudKit。但是,我不知道如何创建一个 CKRecord 类。特别是,我不知道如何定义它的“record
我正在尝试在 CKRecord 上设置父项。基本上,提醒是列表的子项。该列表已存在于服务器上。 let record = CKRecord(recordType: "Reminder", record
我目前正在开发一个 iPhone 应用程序,它利用 CloudKit 在用户设备之间同步应用程序数据。我使用 CoreData 作为我的本地缓存,以确保该应用在设备离线时仍然可用。 问题 在开发过程中
我正在寻找保存 CKRecord 时正确处理错误的示例。根据Apple docs我应该“使用错误对象中的信息来确定问题是否有解决方法。” 我知道错误对象有一个 userInfo 字典,但我如何找出字典
我是一名优秀的程序员,十分优秀!