【问题标题】:SwiftUI - Include Relationship info in FetchRequestSwiftUI - 在 FetchRequest 中包含关系信息
【发布时间】:2020-11-12 22:07:09
【问题描述】:

我有一个与 Accounts 实体具有一对多关系的 Expense 实体。

我当前的获取请求如下:

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)

我的谓词是:

predicate: NSPredicate(format: "expenseDate >= %@ AND expenseDate < %@", datesView.prevMonthPayStart as NSDate, datesView.nextPaydate as NSDate)

当我打印我得到的结果时

[{
    expenseAccount = "Test Account";
    expenseCategory = "Test Category";
    expenseCost = 123;
    expenseDate = "2020-11-12 05:00:00 +0000";
    expenseIsPaid = 1;
    expenseName = Test;
    expenseType = "One-time";
    id = "AFB5EB0E-20A2-47EA-8F36-22D07571C213";
    shouldDupe = 1;
}, {
    expenseAccount = "Test Account";
    expenseCategory = "Test Category";
    expenseCost = 23;
    expenseDate = "2020-11-13 05:00:00 +0000";
    expenseIsPaid = 0;
    expenseName = "Test Recurring";
    expenseType = Monthly;
    id = "5CFB5E58-4377-40DA-9C6A-AF8027ACEC60";
    shouldDupe = 1;
}]

我知道我不会看到 nil 的属性,但我想通过 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;
})

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    你能不能试试 NSExpressions,你不会获取,所以你会很高效。

        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")
        }
    }
    
    
      
    

    【讨论】:

    • 谢谢!这确实有助于获得关系值,但现在我只获得 isCredit 值。我需要获取 isCredit 和其他 Expenses 对象信息。
    • 好的,好的,那么您应该在数组中添加另一个表达式。 let expression2 = .... 然后将其添加到 fetchRequest.propertiesToFetch = [expression1, expression2]。请让我知道它是否有效
    • 似乎不起作用@Carlos Maria Caraccia。我在原始帖子中包含了我的新表达式,因为在这里很难格式化。当我添加表达式时,我似乎得到了一个空字典。
    • @nastri83 您是否尝试在谓词中添加 AND 以获得两个结果?
    • 我也将我的谓词添加到原始帖子中。我有许多与谓词相匹配的费用。当我说它打印一个空字典时,我可能说错了。我收到每个对象的字典数组,但每个字典都是空白的。与谓词匹配的 2 个对象的示例:` [{ }, { }]`
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2020-01-31
    相关资源
    最近更新 更多