核心数据和关系谓词

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)
    


【讨论】:

以上是关于核心数据和关系谓词的主要内容,如果未能解决你的问题,请参考以下文章

谓词匹配一对多关系核心数据

核心数据获取请求关系属性谓词

核心数据获取谓词“不包含”?

我无法根据与谓词的关系从核心数据中获取实体

具有一对多关系的复杂核心数据谓词

核心数据:有序关系中第一个元素的谓词