我需要查询所有记录类型,而不进行任何过滤.我试过两种方法:
let query = CKQuery(recordType: "Pm", predicate: nil)
let query = CKQuery(recordType: "Pm", predicate: NSPredicate(format: ""))
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
'NSInvalidArgumentException',原因:'无法解析格式字符串""'
怎么做?
对Cloudkit私有默认区域的查询结果是否有任何限制?我不知道为什么我只使用以下查询收到前100条记录:
let p = NSPredicate(format: "(type == 'entered') AND (timestamp >= %@) AND (timestamp <= %@)", from, to)
let q = CKQuery(recordType: self.beaconRecordType, predicate: p)
q.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
self.privateDatabase?.performQuery(q, inZoneWithID: nil, completionHandler: { results, error in
//count = 100
println(results.count)
}
Run Code Online (Sandbox Code Playgroud)
好的.正如Edwin在答案中提到的,解决方案是使用CKQueryOperation获取初始数据块,然后使用completionBlock中的"cursor"来触发另一个操作.这是一个例子:
UPDATE
func fetchBeacons(from:NSDate, to:NSDate) {
let p = NSPredicate(value: true)
let q = CKQuery(recordType: self.beaconRecordType, predicate: p)
let queryOperation = CKQueryOperation(query: q)
queryOperation.recordFetchedBlock = fetchedARecord
queryOperation.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor!, …Run Code Online (Sandbox Code Playgroud) 我的谓词想要排除已经下载并在[CKRecordID]中可用的一些记录.现在我可以查询1个CKRecordID [0],但不能查询[CKRecordID]数组.我该如何查询数组?
let excludeIDs: [CKRecordID]
Run Code Online (Sandbox Code Playgroud)
这有效:
let pred1 = NSPredicate(format: "NOT(recordID = %@)", excludeIDs[0])
Run Code Online (Sandbox Code Playgroud)
但这不是:
let pred1 = NSPredicate(format: "NOT(recordID IN %@)", excludeIDs)
Run Code Online (Sandbox Code Playgroud)
错误:loadImageCompareRecordIDsAndEndDateThatHaveNotEnded错误:无效谓词:无效谓词:数组成员必须符合CKRecordValue :("","","","","")(CKRecordID)
代码的其他一般部分:
let sort = NSSortDescriptor(key: "creationDate", ascending: false)
let query = CKQuery(recordType: MyRecordTypes.ImageCompare, predicate: pred1)
query.sortDescriptors = [sort]
let operation = CKQueryOperation(query: query)
operation.desiredKeys = ["endDate"]
operation.resultsLimit = 50
Run Code Online (Sandbox Code Playgroud) 我需要创建一个CKQuery谓词包含记录引用的位置,而不是记录的字段.
像这样
let query = CKQuery(recordType: "OUP", predicate: NSPredicate(format: "o = %@", "FF4FB4A9-271A-4AF4-B02C-722ABF25BF44")
Run Code Online (Sandbox Code Playgroud)
我如何设置oCKReference,而不是字段!
我收到此错误:
字段"o"的查询谓词中的字段值类型不匹配
CKQuerydoc说:谓词中使用的键名对应于当前评估记录中的字段.键名可以包括记录的元数据属性的名称,例如"creationDate"或您添加到记录中的任何数据字段.
我可以在其中使用哪些元数据CKQuery?我能用record.recordID.recordName,如果有key,它的用途是什么?
有没有办法限制在CKQuery?中返回的结果数量?
在SQL,可以运行像这样的查询SELECT * FROM Posts LIMIT 10,15.LIMIT 10,15在CloudKit中有什么类似查询的最后部分吗?
例如,我想加载第5分的结果,然后,一旦用户向下滚动,我想加载下一个5分的结果,等等.在SQL中,它将是LIMIT 0,5,然后LIMIT 6,10,依此类推.
有一两件事,将工作是使用一个for循环,但是这将是非常密集的,因为我会从iCloud中选择所有的值,然后依次通过他们找出选择其中5,和我期待有在数据库中有很多不同的帖子,所以我只想加载那些需要的帖子.
我正在寻找这样的东西:
var limit: NSLimitDescriptor = NSLimitDescriptor(5, 10)
query.limit = limit
CKContainer.defaultContainer().publicCloudDatabase.addOperation(CKQueryOperation(query: query)
//fetch values and return them
Run Code Online (Sandbox Code Playgroud) 假设我有一个'物种'记录类型,其中包含由许多用户创建的公共记录.目前,我的查询检索"物种"的所有记录:
private func fetchSpecies() {
// Fetch Public Database
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
// Initialize Query
let query = CKQuery(recordType: "Species", predicate: NSPredicate(format: "TRUEPREDICATE"))
// Configure Query
query.sortDescriptors = [NSSortDescriptor(key: "latinName", ascending: true)]
// Perform Query
publicDatabase.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// Process Response on Main Thread
self.processResponseForQuery(records, error: error)
})
}
}
Run Code Online (Sandbox Code Playgroud)
如何只获取当前用户创建的记录(如设备所有者)?
谢谢!
我想使用带有两个字段的OR来查询CloudKit.但我找不到办法如何做到这一点.我做的是:
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"(creatorUserRecordID == %@)", userId];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(toUser == %@)", userId];
NSCompoundPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate1, predicate2]];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Message" predicate:compPredicate];
Run Code Online (Sandbox Code Playgroud)
但遗憾的是CKQuery不支持OR查询(如文档中所述)我可以通过其他方式实现此效果吗?
每当我以编程方式创建新的CKRecordType时,我都会遇到cloud-kit的问题.在云工具包仪表板中,这是我收到的错误消息:
快速简单的解决方法是单击"添加ID查询索引"按钮并完成它,但是,我想知道是否有一种方法可以以编程方式完成此操作.原因在于,当部署应用程序时,用户将能够创建新的记录类型,如果每次用户决定创建新记录时我必须检查cloud-kit,那将是一个很大的麻烦和麻烦类型.
任何帮助,将不胜感激!
我有一个CloudKit应用程序,其中包含publicDB中的数据.这是能够由任何授权用户创建和读取的安全数据,但我根据我的应用程序所做的查询限制了这一点.例如,用户C将不会查询表明与用户A和用户B的关系而非用户C的数据对象.
我担心有人可能越狱/劫持我的应用程序并执行授权应用程序有能力执行的查询,但绝不会这样做.我如何确定"经过身份验证"的用户实际上是使用我的应用程序的正版身份验证用户,而不是某些第三方将代码注入我的应用程序?