CoreData Fetch 请求返回错误 - 如何从核心数据访问实际对象/值?

问题描述 投票:0回答:1

我正在使用 swiftUI 开发一个应用程序。我在创建项目时选择了“使用核心数据”,因此核心数据的样板代码包含在项目中。

在实体/属性配置中,我创建了一个名为 Users 的实体,其中包含一个名为 username 的字符串属性。

我使用提供的核心数据函数来保存用户名“John”。但是,当我尝试获取该值时,我得到的是以下内容而不是实际的用户名。

FetchedResults(结果:<__NSSingleObjectArrayI 0x6000010d85b0>( (实体:用户;id:0x972ee5e326034de5 x-coredata://ABB653C3-72E7-457F-9ACD-4A99FC82DC92/Users/p1;数据:) )

我知道“故障”不是错误,但我显然需要访问我保存的实际值而不是上述结果。

这是我的观点的代码。当我尝试列出用户的内容时,我得到了提到的响应而不是实际的用户名。

import SwiftUI

struct Download: View {
    
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Users.username, ascending: true)],
        animation: .default)

    private var users: FetchedResults<Users>
    
    var body: some View {
        
        VStack {
         
            List(users) { user in
                
                Text("\(user)")
                
                
            }
            
            
            Button("Click Here") {
                
               
                print(users.count)
                print(users)
                
                    
                }
            
        }
        
        
            
        }
    }


struct Download_Previews: PreviewProvider {
    static var previews: some View {
        Download()
    }
}

这是我用来保存用户名值的函数代码:

private func addUser(name: String) {
        withAnimation {
            let newUser = Users(context: viewContext)
            newUser.username = name

            do {
                try viewContext.save()
            } catch {
                
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }

将数组大小的计数打印到控制台会给我正确的值(即 1)。所以我的保存似乎奏效了。

只是无法将“John”的实际值输出到我的视图或控制台。

ios swift swiftui core-data
1个回答
0
投票
  1. 将 NSFetchRequest 直接传递给 propertyWrapper,并将

    returnsObjectsAsFaults
    标记为 false。

  2. 只需访问活着的

    NSManagedObject
    的实例属性(又名
    Firing Faults

触发故障 错误处理是透明的——您不必执行提取来发现错误。如果在某个阶段访问故障对象的持久属性,Core Data 会自动检索该对象的数据并初始化该对象。此过程通常称为触发故障。如果您访问 Department 对象的一个属性——例如,它的名称——错误会触发,Core Data 会为您执行一次提取以检索该对象的所有属性。 (请参阅 NSManagedObject 以获取不会导致故障触发的方法列表。)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.