核心数据和关系谓词
core data and relationship predicate
我几个月前开始 swift 和核心数据,通常我在这个网站上找到了我的答案,但第一次我真的被 "Relationship" 和 "Predicates"
我创建了第一个视图控制器,其中包含一个由用户填充的表视图,这部分工作如我所愿。
用户可以 "tap" 一个单元格并打开一个带有新表视图的新视图控制器,我想用与用户点击的单元格相关的数据填充这个表视图。
我正在使用 CoreData 并且我设置了 2 个实体:"Compte" 和 "Operation" 它们是一对多的关系(一个对多个操作的竞争)
我在这里 :
当用户点击单元格时,我正在使用 segue 将 "Compte" 发送到第二个视图控制器:
//继续
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let guest = segue.destination as! OperationsViewController
let indexPath = tableView.indexPathForSelectedRow
let operation = fetchedResultController.object(at: indexPath!)
guest.compteTestRelation = operation
}
在 OperationsViewController
中我设置了这个变量:
var compteTestRelation: Compte!
为了测试我的数据,我创建了一个这样的 FOR 循环和一个函数:
for index in 1 ... 10 {
let newOp = Operation(context: context)
newOp.nom = "Test Compte \(index)"
newOp.date = NSDate()
newOp.moyenPaiement = "Test"
compteTestRelation.addToRelationCompte(newOp) // RelationShip
}
do {
try context.save()
} catch {
print(error.localizedDescription)
}
函数
func displayOperation() {
if let opList = compteTestRelation.relationCompte as? Set<Operation> {
sortedOperationArray = opList.sorted(by: { (operationA:Operation, operationB:Operation) -> Bool in
return operationA.date!.compare(operationB.date! as Date) == ComparisonResult.orderedAscending
})
print(sortedOperationArray)
}
}
在带有 "print" 的控制台中,它的工作方式与我希望的一样,具体取决于单元格是否被点击,打印(sortedOperationArray)是否出现
我现在的问题是如何用这些数据填充我的表视图,当我在我的 FetchResultController 中使用谓词时出现错误或一个空表视图,但在控制台中一切似乎都正常所以我认为关系没问题..
如果我不使用 PREDICATE,我可以用数据填充我的表视图,但我总是看到所有数据
我在 whosebug.com 上看到过其他类似的问题和答案,但目前没有任何效果。
谢谢! :)
我找到了另一种预测数据的方法,它现在对我有用
我在我的 OPERATION 实体中创建了一个名为 "id" 的新属性,当我创建我的数据时,我给一个 ID 赋予了属性,如下所示:
for index in 1 ... 10 {
let newOp = Operation(context: context)
newOp.nom = "Test Compte \(index)"
newOp.date = NSDate()
newOp.moyenPaiement = "Test"
newOp.id = "id123\(compteTestRelation.nom!)"
compteTestRelation.addToRelationCompte(newOp) // RelationShip
}
do {
try context.save()
} catch {
print(error.localizedDescription)
}
然后我在 FetchResultController 中这样预测我的数据:
func setupFetchedResultController () {
let operationsRequest: NSFetchRequest<Operation> = Operation.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "nom", ascending: true)
let keyPath = "id"
let searchString = "id123\(compteTestRelation.nom!)"
let operationsPredicate = NSPredicate(format: "%K CONTAINS %@", keyPath, searchString)
operationsRequest.returnsObjectsAsFaults = false
operationsRequest.sortDescriptors = [sortDescriptor]
operationsRequest.predicate = operationsPredicate
fetchedResultController = NSFetchedResultsController(fetchRequest: operationsRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
do {
try fetchedResultController.performFetch()
} catch {
print(error.localizedDescription)
}
}
我几个月前开始 swift 和核心数据,通常我在这个网站上找到了我的答案,但第一次我真的被 "Relationship" 和 "Predicates"
我创建了第一个视图控制器,其中包含一个由用户填充的表视图,这部分工作如我所愿。 用户可以 "tap" 一个单元格并打开一个带有新表视图的新视图控制器,我想用与用户点击的单元格相关的数据填充这个表视图。
我正在使用 CoreData 并且我设置了 2 个实体:"Compte" 和 "Operation" 它们是一对多的关系(一个对多个操作的竞争)
我在这里 :
当用户点击单元格时,我正在使用 segue 将 "Compte" 发送到第二个视图控制器:
//继续
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let guest = segue.destination as! OperationsViewController let indexPath = tableView.indexPathForSelectedRow let operation = fetchedResultController.object(at: indexPath!) guest.compteTestRelation = operation }
在
OperationsViewController
中我设置了这个变量:var compteTestRelation: Compte!
为了测试我的数据,我创建了一个这样的 FOR 循环和一个函数:
for index in 1 ... 10 { let newOp = Operation(context: context) newOp.nom = "Test Compte \(index)" newOp.date = NSDate() newOp.moyenPaiement = "Test" compteTestRelation.addToRelationCompte(newOp) // RelationShip } do { try context.save() } catch { print(error.localizedDescription) }
函数
func displayOperation() { if let opList = compteTestRelation.relationCompte as? Set<Operation> { sortedOperationArray = opList.sorted(by: { (operationA:Operation, operationB:Operation) -> Bool in return operationA.date!.compare(operationB.date! as Date) == ComparisonResult.orderedAscending }) print(sortedOperationArray) } }
在带有 "print" 的控制台中,它的工作方式与我希望的一样,具体取决于单元格是否被点击,打印(sortedOperationArray)是否出现
我现在的问题是如何用这些数据填充我的表视图,当我在我的 FetchResultController 中使用谓词时出现错误或一个空表视图,但在控制台中一切似乎都正常所以我认为关系没问题..
如果我不使用 PREDICATE,我可以用数据填充我的表视图,但我总是看到所有数据
我在 whosebug.com 上看到过其他类似的问题和答案,但目前没有任何效果。
谢谢! :)
我找到了另一种预测数据的方法,它现在对我有用
我在我的 OPERATION 实体中创建了一个名为 "id" 的新属性,当我创建我的数据时,我给一个 ID 赋予了属性,如下所示:
for index in 1 ... 10 {
let newOp = Operation(context: context)
newOp.nom = "Test Compte \(index)"
newOp.date = NSDate()
newOp.moyenPaiement = "Test"
newOp.id = "id123\(compteTestRelation.nom!)"
compteTestRelation.addToRelationCompte(newOp) // RelationShip
}
do {
try context.save()
} catch {
print(error.localizedDescription)
}
然后我在 FetchResultController 中这样预测我的数据:
func setupFetchedResultController () {
let operationsRequest: NSFetchRequest<Operation> = Operation.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "nom", ascending: true)
let keyPath = "id"
let searchString = "id123\(compteTestRelation.nom!)"
let operationsPredicate = NSPredicate(format: "%K CONTAINS %@", keyPath, searchString)
operationsRequest.returnsObjectsAsFaults = false
operationsRequest.sortDescriptors = [sortDescriptor]
operationsRequest.predicate = operationsPredicate
fetchedResultController = NSFetchedResultsController(fetchRequest: operationsRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
do {
try fetchedResultController.performFetch()
} catch {
print(error.localizedDescription)
}
}