我试图在CloudKit中存储联系人组,如果我尝试创建一大组记录,CKReferenced到单个组记录,我会收到错误.
该限制似乎约为700左右的记录.
有没有其他人看到类似的结果,或者可以确认限制的存在(或不存在)?我无法在文档中找到任何内容,也无法通过Google找到任何内容.
注意:我已经将我提交的记录拆分为400或更少的批次,因为这似乎是一个硬限制.
我对如何最好地保存包含CloudKit中其他对象数组的对象感到困惑.
假设我有一个待办事项列表应用程序,它有不同的项目集合.我如何保存/获取整个项目集合?
我是否有一个Record类型的Collection,它有一个名为"Name"的String属性,然后是一个名为"Items"的引用列表属性?
我知道Record类型的Item需要有一个名为"Collection"的引用属性,因为CloudKit如何从子对象引用它的父对象.
我已设法使用以下代码保存没有任何Item实例的集合
func addCollection(collection: Collection!, completion: (error: NSError!) -> ()) {
if collection == nil
return
}
let collectionRecord = CKRecord(recordType: "Collection")
CollectionRecord.setObject(collection.name, forKey: "Name")
privateDB.saveRecord(collectionRecord) {
record, error in
dispatch_async(dispatch_get_main_queue()) {
completion(error: error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个选项是在保存Collection时,循环遍历Item的所有实例并单独保存它们,它们的Reference Attribute to Collection在CloudKit端进行连接,但这似乎是太多的网络调用.
在我的CloudKit设置中,我有一个Person
记录类型,每个人都有一个Friend
属于CKReference
另一个Person
对象的属性.
我拿了所有Person
CKRecord
的.我在桌子上列出这些人并将他们的朋友列在他们身上.目前我只是使用CKReference
和单独获取每个朋友recordID
.
这是我能看到的唯一方法,但最佳做法是什么?特别是因为我可能吸引了大量的朋友.单独获取所有这些对象似乎违反直觉.
我想知道是否有一个类似CoreData的方法,你可以选择在主要提取中获取相关对象?因此,例如,当我获取Person
它时,它也会自动获取朋友.
是否有人有使用经验的CloudKit
选项DeleteSelf
了CKReference
?这是我从文档中得到的:
DeleteSelf
引用记录的删除操作.删除记录还会删除包含指向该记录的CKReference对象的所有记录.删除附加记录可能会触发更多记录的级联删除.删除在默认区域中是异步的,在自定义区域中是立即的.
所以我一直在测试这个,我创建了多个CKReference
对象,使用CloudKit Dashboard
和使用我的应用程序.每当我使用我的应用程序执行此操作时,我都会像这样创建引用:
let reference:CKReference = CKReference(recordID: savedFriend.friendID, action: CKReferenceAction.DeleteSelf)
Run Code Online (Sandbox Code Playgroud)
我必须做错事,因为无论何时我去手动删除使用仪表板引用的记录,或者设置我的应用程序以编程方式删除它,记录都会消失,但引用永远不会被删除.我想也许我应该等待,它最终会发生,但几小时后它仍然在那里检查,就像它本应该删除自己.这有点令人沮丧,因为我设计了一些我的代码,假设这可以工作,现在我可以有一个浪费资源的应用程序试图找到一个CKRecord
不再存在的.我应该不依靠这个来工作吗?我感谢任何帮助或建议.
更新〜04/07/2016
我跳了回来,并发布了一个更新,问题已经解决了.我并不完全相信这个问题不会重新出现,所以我昨晚寻求一些保证.我创建了5个不同的,CKRecords
并创建了各种不同的CKReference
对象,以便在我的数 然后我继续为CKReferenceAction.DeleteSelf
每个引用设置选项(我通过仪表板手动尝试了两个,其他三个以编程方式完成).无论如何,我等了几分钟然后删除了引用的记录......十分钟后,引用仍然存在.我又等了5-10分钟,他们还在那里,所以我上床睡觉,假设早上他们肯定要走了,对吧?错误!12个小时后,CKReference
条目仍在那里,引用的记录仍然没有.我肯定是在挠头,似乎这是一个错误CloudKit
.我应该提一下,我也注意到我的仪表板中有一些奇怪的行为.在过去的四天左右,在左下角,它一直表示它是"重新索引开发数据",这里是一张图片,例如:
这会导致这个问题吗?有人熟悉这个问题并知道解决这个问题的方法吗?任何建议,将不胜感激.我已经向Apple提交了一份错误报告.
.DeleteSelf如何真正起作用?文件说:
当引用对象的操作设置为CKReferenceActionDeleteSelf时,引用的目标(即存储在引用的recordID属性中的记录)将成为源记录的所有者.删除目标(所有者)记录将删除其所有源记录.
但我的印象是删除目标并不总是删除源.它仍然在容器中,客户端下载它,并期望参考点到某处,但在客户端上构建服务器数据存储片时,目标不存在,这是非常烦人的?
你怎么对待这个案子?你忽略那种记录?或者您定期查找CloudKit存储,搜索损坏的记录以删除它们?
或者不是删除记录,最好设置一个属性,使其处于已删除状态,但将其保留在数据库中?
我有一个RecordType Account
和另一个Friends
.因为Account
我正在设置RecordID
每个记录的创建,我有一个列Name
.
对于朋友,我有两列,Me
和MyFriend
.MyFriend
是包含RecordID
帐户的参考.
如何检索作为我朋友的帐户名称?我需要查询Friends以获取Me
我所在的所有记录,RecordID
然后我需要使用这些记录的引用来从Account表中获取Names.
我尝试了以下但没有得到任何结果:
let predicate = NSPredicate(format: "Me = %@", recordID)
let query = CKQuery(recordType: "Friends", predicate: predicate)
publicDB.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in
if error != nil {
println("Error fetching from Friends table: \(error.description)")
} else {
for friend in results {
var key = friend.objectForKey("MyFriend") as String
self.publicDB.fetchRecordWithID(CKRecordID(recordName: key), completionHandler: { (record, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为包含用户的 CKReference 字段的记录设置 CKSubscription。但是无论何时创建记录,它都会忽略复合谓词的这一部分,并且通知永远不会出现。在 CKSubscription 的谓词中使用 CKReference 有什么不同吗?我进入仪表板以在我自己的用户记录 ID 下输入新记录(在模拟器中运行另一个用户时),因为我相信我读到如果记录来自设备,它将不会收到通知。非常感谢任何见解,因为我已经坚持了一个星期,并且无法在网上找到任何特定于此的内容。我能够获得真正的类型谓词通知,所以我认为我的基本设置没问题。
在仪表板中,我看到两个测试用户都有一个通用订阅,但没有看到任一用户的任何特定记录 ID(这有关系吗?):
Notifications.read (equals string)
Notifications.user (equals reference)
Run Code Online (Sandbox Code Playgroud)
当我执行 fetchAllSubscriptionsWithCompletionHandler 方法时,它会在调试器中将此设备的当前用户的特定记录 ID 显示为 CKReference。所以我不知道为什么它不起作用。
这是我首先创建 CKReference 然后将其用于谓词的代码:
var recordIDString = CKRecordID(recordName: "_a86dac8ee05f8c6ab35746bf9663d7b8")
// I normally store this string in the NSUserDefaults.
let userRef = CKReference(recordID: recordIDString, action: .DeleteSelf)
let predicate = NSPredicate(format: "user = %@", userRef)
let predicateTwo = NSPredicate(format: "read = %@", "")
// I want the read field to be empty, which tells me user has not read …
Run Code Online (Sandbox Code Playgroud) 斯威夫特 3.1,Xcode 8.3.3
我在 CloudKit 中有一个记录类型,Aircraft
它有一个名为 的字段fieldValues
,类型为Reference List
。
在我的代码中,我有一个aircraft
CKRecord 和几个fieldValue
作为飞机子代的 CKRecord。
我如何将所有这些fieldValue
记录放入aircraft
的参考列表中?
创建 aCKReference
似乎只允许其中有一条记录:
let reference = CKReference(record: fieldValueRecord, action: .deleteSelf)
Run Code Online (Sandbox Code Playgroud)
但我试图将许多fieldValue
s连接到单个aircraft
. 有任何想法吗?
所以我hava记录包含一个CKReference List字段.
现在我想批量获取所有引用的(通过这个CKReferences列表)记录(来自另一种类型).
有任何想法吗?