Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI-在FetchRequest中包含关系信息_Swift_Core Data_Swiftui - Fatal编程技术网

SwiftUI-在FetchRequest中包含关系信息

SwiftUI-在FetchRequest中包含关系信息,swift,core-data,swiftui,Swift,Core Data,Swiftui,我有一个与账户实体具有一对多关系的支出实体 我当前的获取请求如下: let request = NSFetchRequest<NSFetchRequestResult>(entityName: Expenses.entity().name ?? "Expenses") request.predicate = predicate request.returnsObjectsAsFaults = false request.resultTy

我有一个与账户实体具有一对多关系的支出实体

我当前的获取请求如下:

let request = NSFetchRequest<NSFetchRequestResult>(entityName: Expenses.entity().name ?? "Expenses")     
        
request.predicate = predicate
request.returnsObjectsAsFaults = false
request.resultType = .dictionaryResultType
let expression = NSExpressionDescription()
// check operations list from apple or nshipster in nsexpressions
expression.expression =  NSExpression(forFunction: "noindex:", arguments:[NSExpression(forKeyPath: "originAccounts.isCredit")])
expression.name = "checkIsCredit"
expression.expressionResultType = .booleanAttributeType // might be another
        
let expression1 = NSExpressionDescription()
expression1.expression = NSExpression(forFunction: "noindex:", arguments:[NSExpression(forKeyPath: "id")])
expression1.name = "checkExpenses"
expression.expressionResultType = .UUIDAttributeType
        
request.propertiesToFetch = [expression,expression1]

context.perform {
    do {
        let results = try request.execute()
        print(results)
我知道我不会看到为零的属性,但我想通过originAccounts关系获得一个属性。这可能吗?具体来说,我想获得originAccounts.isCredit的值。下面是一个示例对象供参考

<Expenses: 0x60000321af80> (entity: Expenses; id: 0xa7ab05bb9341bf4a <x-coredata://ED302202-3018-445F-8FFE-DD2E85219E64/Expenses/p1>; data: {
    expenseAccount = "Test Account";
    expenseCategory = "Test Category";
    expenseCost = 123;
    expenseDate = "2020-11-12 05:00:00 +0000";
    expenseId = nil;
    expenseIsPaid = 1;
    expenseName = Test;
    expenseType = "One-time";
    id = "AFB5EB0E-20A2-47EA-8F36-22D07571C213";
    lastMonthlyExpenseID = nil;
    nextMonthlyExpenseID = nil;
    originAccounts = "0xa7ab05bb9341bf4e <x-coredata://ED302202-3018-445F-8FFE-DD2E85219E64/Accounts/p1>";
    originCategories = nil;
    shouldDupe = 1;
})
(实体:费用;id:0xa7ab05bb9341bf4a;数据:{
ExpenseCount=“测试帐户”;
ExpenseCegory=“测试类别”;
费用成本=123;
expenseDate=“2020-11-12 05:00:00+0000”;
支出类=零;
支出援助=1;
expenseName=测试;
expenseType=“一次”;
id=“AFB5EB0E-20A2-47EA-8F36-22D07571C213”;
lastMonthlyExpenseID=零;
下一个月支出ID=零;
originAccounts=“0xa7ab05bb9341bf4e”;
原始类别=零;
shouldDupe=1;
})

您可以尝试N表达式吗?您不会进行提取,因此效率会更高

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "yourEntity")
    fetchRequest.predicate = NSPredicate(format: "yourPredicate")
    fetchRequest.resultType = .dictionaryResultType
    fetchRequest.returnsObjectsAsFaults = false
    
    let expression = NSExpressionDescription()
    // check operations list from apple or nshipster in nsexpressions
    expression.expression =  NSExpression(forFunction: "yourOperation", arguments:[NSExpression(forKeyPath: "Expenses.originAccounts.isCredit")])
    expression.name = "yourName"
    expression.expressionResultType = .decimalAttributeType // might be another
    
    fetchRequest.propertiesToFetch = [expression]
    
    do {
        let results = try viewContext.fetch(fetchRequest)
        print(results)
    } catch {
        print("Failed to fetch aggregates")
    }
}


  
let fetchRequest=NSFetchRequest(entityName:“yourEntity”)
fetchRequest.predicate=NSPredicate(格式:“yourPredicate”)
fetchRequest.resultType=.dictionaryResultType
fetchRequest.returnsObjectsAsFaults=false
let expression=NSExpressionDescription()
//在nsexpressions中检查apple或nshipster中的操作列表
expression.expression=NSExpression(对于函数:“yourOperation”,参数:[NSExpression(forKeyPath:“Expenses.originAccounts.isCredit”))
expression.name=“yourName”
expression.expressionResultType=.decimalAttributeType//可能是另一个
fetchRequest.propertiesToFetch=[表达式]
做{
let results=try viewContext.fetch(fetchRequest)
打印(结果)
}抓住{
打印(“无法获取聚合”)
}
}

谢谢!这确实有助于获取关系值,但现在我只获取isCredit值。我需要获取isCredit和其他费用对象信息。好的,很好,那么您应该向数组中添加另一个表达式。让表达式2=。。。。然后将其添加到fetchRequest.propertiesToFetch=[expression1,expression2]。如果卡洛斯·玛丽亚·卡拉西亚似乎不起作用,请告诉我。我已经将我的新表达包含在原始帖子中,因为这里很难格式化。当我添加表达式时,我似乎得到了一个空字典。@nastri83您是否尝试将AND添加到谓词以获得这两个结果?我也将谓词添加到了原始文章中。我有许多与谓词匹配的费用。当我说它打印一本空字典时,我可能说错了。我收到每个对象的一个字典数组,但每个字典都是空的。与谓词匹配的两个对象的示例:`[{},{}]`
<Expenses: 0x60000321af80> (entity: Expenses; id: 0xa7ab05bb9341bf4a <x-coredata://ED302202-3018-445F-8FFE-DD2E85219E64/Expenses/p1>; data: {
    expenseAccount = "Test Account";
    expenseCategory = "Test Category";
    expenseCost = 123;
    expenseDate = "2020-11-12 05:00:00 +0000";
    expenseId = nil;
    expenseIsPaid = 1;
    expenseName = Test;
    expenseType = "One-time";
    id = "AFB5EB0E-20A2-47EA-8F36-22D07571C213";
    lastMonthlyExpenseID = nil;
    nextMonthlyExpenseID = nil;
    originAccounts = "0xa7ab05bb9341bf4e <x-coredata://ED302202-3018-445F-8FFE-DD2E85219E64/Accounts/p1>";
    originCategories = nil;
    shouldDupe = 1;
})
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "yourEntity")
    fetchRequest.predicate = NSPredicate(format: "yourPredicate")
    fetchRequest.resultType = .dictionaryResultType
    fetchRequest.returnsObjectsAsFaults = false
    
    let expression = NSExpressionDescription()
    // check operations list from apple or nshipster in nsexpressions
    expression.expression =  NSExpression(forFunction: "yourOperation", arguments:[NSExpression(forKeyPath: "Expenses.originAccounts.isCredit")])
    expression.name = "yourName"
    expression.expressionResultType = .decimalAttributeType // might be another
    
    fetchRequest.propertiesToFetch = [expression]
    
    do {
        let results = try viewContext.fetch(fetchRequest)
        print(results)
    } catch {
        print("Failed to fetch aggregates")
    }
}