核心数据和关系谓词
Posted
技术标签:
【中文标题】核心数据和关系谓词【英文标题】:core data and relationship predicate 【发布时间】:2017-02-20 14:57:40 【问题描述】:几个月前我开始使用 swift & core data,通常我在这个网站上找到了我的答案,但我第一次真的被“关系”和“谓词”所困扰
我创建了第一个视图控制器,其中包含一个由用户填充的 tableview,这部分工作如我所愿。 用户可以“点击”一个单元格并使用新的 tableview 打开一个新的视图控制器,我想用与用户点击的单元格相关的数据填充这个 tableview。
我正在使用 CoreData,我设置了 2 个实体:“Compte”和“Operation”,它们是一对多的关系(一个 compte 用于 MANY 操作)
我在这里:
当用户点击单元格时,我正在使用 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 LOOP 和一个 FUNCTION:
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)
在带有“打印”的控制台中它的工作方式就像我希望单元格被点击时打印(sortedOperationArray)是否出现
我现在的问题是如何用这些数据填充我的表视图,当我在 FetchResultController 中使用谓词时出现错误或空表视图,但在控制台中一切似乎都正常,所以我认为这种关系是好的..
如果我不使用 PREDICATE,我可以用数据填充我的 tableview,但我总是看到所有数据
我在 ***.com 上看到了其他类似的问题和答案,但目前没有任何效果。
谢谢! :)
【问题讨论】:
【参考方案1】:我找到了另一种方法来预测我的数据,它现在对我有用
我在我的 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)
【讨论】:
以上是关于核心数据和关系谓词的主要内容,如果未能解决你的问题,请参考以下文章