除了 FetchedData 之外,CoreData FetchRequest 正在使用可选结果数据加载我的列表

Posted

技术标签:

【中文标题】除了 FetchedData 之外,CoreData FetchRequest 正在使用可选结果数据加载我的列表【英文标题】:CoreData FetchRequest is loading my List with Optional result data in addition to the FetchedData 【发布时间】:2021-05-06 02:51:20 【问题描述】:

我在 AdminView 结构中调用 @FetchRequest,我希望使用 ForEach 将数据呈现在列表中。我正在请求所有用户实体数据,但是当我运行应用程序时,列表显示了我的 2 个现有条目结果,但它还显示了大约 40 个条目,由于某种原因默认为可选字符串“TEST”。

我试图了解如何让列表只显示两个用户条目而不显示列表中的默认字符串。

非常感谢!

以下是相关代码:

import Foundation
import CoreData


extension User 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<User> 
        return NSFetchRequest<User>(entityName: "User")
    

    @NSManaged public var admin: Bool
    @NSManaged public var company: String?
    @NSManaged public var name: String?
    @NSManaged public var password: String?
    @NSManaged public var photo: Data?
    @NSManaged public var username: String?
    @NSManaged public var id: UUID?
    @NSManaged public var tickets: NSSet?



// MARK: Generated accessors for tickets
extension User 

    @objc(addTicketsObject:)
    @NSManaged public func addToTickets(_ value: Ticket)

    @objc(removeTicketsObject:)
    @NSManaged public func removeFromTickets(_ value: Ticket)

    @objc(addTickets:)
    @NSManaged public func addToTickets(_ values: NSSet)

    @objc(removeTickets:)
    @NSManaged public func removeFromTickets(_ values: NSSet)



extension User : Identifiable 



extension User 
    static func getAllUsers() -> NSFetchRequest<User> 
        let request:NSFetchRequest<User> = User.fetchRequest()

        let sortDescriptor = NSSortDescriptor(keyPath: \User.company, ascending: false)
        request.sortDescriptors = [sortDescriptor]

        return request
    






import SwiftUI

struct AdminView: View 
    @Environment(\.managedObjectContext) var moc
    @EnvironmentObject var goToContentView: moveToContentView
    @ObservedObject var selectedUser : User
    @State var selectedImageArray : [UIImage]
    
    @FetchRequest(fetchRequest: User.getAllUsers()) var allUsers:FetchedResults<User>

    var body: some View 
        List
            ForEach(self.allUsers)  user in
                VStack
                    Text(user.company ?? "TEST")
                
            
     
        .toolbar(content: 
            EditButton()
        )
        .animation(.default)
        .navigationBarBackButtonHidden(true)
        .navigationTitle("ADMIN")
        .navigationBarItems(leading: Button(action: 
            
            if self.goToContentView.goToViewFromLogin == true 
                self.goToContentView.goToViewFromLogin = false
             else 
                self.goToContentView.goToViewFromRegister = false
            
            
        ) 
            HStack 
                Text("Sign Out")
            
        ,trailing: HStack
            Image(systemName: "bell")
                .font(.system(size: 30))
            Image(uiImage: selectedImageArray.first!)
                .resizable()
                .scaledToFit()
                .clipShape(Circle())
                .frame(width: 50, height: 50)
            Text(selectedUser.name!)
                .font(.system(size: 20))
        )
        
    

【问题讨论】:

听起来您可能无意中将大量空白条目添加到核心数据数据库中。那可能发生过吗?可能值得从您的模拟器或手机中删除您的应用程序(取决于您运行它的位置),重建然后重新添加两个用户记录以查看您是否获得相同的行为。如果您愿意,我还可以告诉您如何使用 SQLViewer 查看实际数据库 【参考方案1】:

将过滤器添加到列表中。您也可以使用 let 代替 nil-coalescing 运算符。不需要 VStack,因为 Text 都在列表中。

List 
   ForEach(self.allUsers.filter( $0.company != nil ))  user in
      if let company = user.company 
          Text(company)
      
   

【讨论】:

以上是关于除了 FetchedData 之外,CoreData FetchRequest 正在使用可选结果数据加载我的列表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 除了 '/' 之外的所有路由都返回 404

除了加载行子集之外,使用 NSFetchedResultsController 有啥好处

sklearn 除了文本之外的其他输入用于文本分类

除了给定字符串之外,匹配任何内容的 JavaScript 模式是啥? [复制]

除了编码之外,如何自动执行 TFS 检查?

为啥除了 _view 之外都设置了 IBOutlets?