除了 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 正在使用可选结果数据加载我的列表的主要内容,如果未能解决你的问题,请参考以下文章
除了加载行子集之外,使用 NSFetchedResultsController 有啥好处