在@FetchRequest 中输入一个动态值,以从 SwiftUI 中的核心数据中获取单个实体

Posted

技术标签:

【中文标题】在@FetchRequest 中输入一个动态值,以从 SwiftUI 中的核心数据中获取单个实体【英文标题】:Input a dynamic value into @FetchRequest, to fetch a single entity from core data in SwiftUI 【发布时间】:2019-12-03 13:54:04 【问题描述】:

我在这里看到了相同类型的错误,但使用了不同类型的代码,所以我认为最好在这种情况下提出一个新问题。我试图通过将名为title 的字符串变量(用作查找该实体的键)传递给@FetchRequest 来从核心数据中“查找特定实体”。这是我使用的部分代码

struct AccountMainPage: View 
    //*** User input ***
    var title: String

    //*** Core data enviroment initialisation ***
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>


    var body: some View 
    //SOME CODE HERE
    

公共类Accounts有扩展名:

extension Accounts 
    static func getSpecificAccounts(findTitle: String) -> NSFetchRequest<Accounts> 
    let request: NSFetchRequest<Accounts> = Accounts.fetchRequest() as! NSFetchRequest<Accounts>

    let findDescriptor = NSPredicate(format: "title == %@",findTitle)

    request.predicate = findDescriptor

    return request
    

但是,@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults&lt;Accounts&gt; 的行有语法错误:

不能在属性初始化器中使用实例成员“title”;属性初始化器在“self”可用之前运行

我的代码有问题吗?

【问题讨论】:

你正在初始化标题,你可以给它一个空字符串值 @fakiho 我不明白你想说什么?我想输入一个字符串。 【参考方案1】:

@FetchRequest 是动态属性,与任何其他属性一样,在调用 AccountMainPage init 之前已初始化,因此 self 尚不可用,这就是为什么您不能使用 title 属性self 的成员,这就是编译器错误的含义。

所以这是一个可能的解决方案:我们用存根请求初始化 fetch request 属性,然后在稍后调用的init 中,用真正的 fetch request 重新初始化它。

这是一个方法演示(所有不相关的东西都删掉了):

struct ContentView: View 
    var title: String

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Accounts.fetchRequest()) var fetchedAccount: FetchedResults<Accounts>

    init(title: String) 
        self.title = title
        _fetchedAccount = FetchRequest<Accounts>(fetchRequest: Accounts.getSpecificAccounts(findTitle: title))
    

...

【讨论】:

感谢它部分工作,fetchedAccount_fetchedAccount 之间有什么区别,我将在 var body: some View ... 部分中使用哪个来调用内部实体? _fetchedAccount 是一个请求,fetchedAccount 是一个响应,所以如果你要显示结果,那么你应该使用fetchedAccount @Asperi 是否可以从 Core Data 中仅获取一个对象,例如:我没有多个用户配置文件对象,只有一个用户配置文件,我只想获取一个对象,但我做不到。我想将用户配置文件作为单个对象获取,而不是像 [UserProfile] 这样的数组。我想做这样的事情:@FetchRequest(entity: UserProfile.entity()) var userProfile: FetchedResult....我不知道这是否可能 这仍然是基于传递给视图的参数自定义 FetchRequest 谓词的首选方法吗?我一直在尝试在 .onAppear() 中使用新的 ios 13 nsPredicate 动态属性,并发现在 SwiftUI 首次更新第一个视图更新后,@FetchRequest 的谓词设置为 nil。还有人看到这个吗? —— 试试这个方法,你不需要实现 init() 的东西。 ***.com/questions/68530633/…

以上是关于在@FetchRequest 中输入一个动态值,以从 SwiftUI 中的核心数据中获取单个实体的主要内容,如果未能解决你的问题,请参考以下文章

CoreData - 如何创建 fetchrequest 以获取随机属性值数组

确保核心数据@FetchRequest 变量动态运行需要哪些代码更改(附加代码)?

有没有办法在 FetchRequest 和 SectionedFetchRequest 之间动态切换?

@FetchRequest 中的 SwiftUI 和动态 NSSortDescriptors

浅谈SwiftUI 3.0新加入的CoreData动态FetchRequest过滤与排序特性

如何将动态输入值添加到本地状态以进行检索